You'll need to create a temporary table and then join the
result:
CREATE TEMPORARY TABLE tmp
SELECT unique_est_id, min(evalue) AS evalue
FROM blast_hit_master_seq2_unique_est_swiss_prot
GROUP BY unique_est_id;
SELECT a.*
FROM blast_hit_master_seq2_unique_est_swiss_prot AS a, tmp
WHERE
a.unique_est_id = tmp.unique_est_id AND
a.evalue = tmp.evalue
Note that you'll get multiple rows per unique_est_id if two
rows have the same minimum value for evalue. To then sort by
the highest score, I think you'll need to use the same
technique with a second temporary table:
CREATE TEMPORARY TABLE tmp
SELECT unique_est_id, min(evalue) AS evalue
FROM blast_hit_master_seq2_unique_est_swiss_prot
GROUP BY unique_est_id;
CREATE TEMPORARY TABLE tmp2
SELECT a.unique_est_id, max(a.score) AS score
FROM blast_hit_master_seq2_unique_est_swiss_prot AS a, tmp
WHERE
a.unique_est_id = tmp.unique_est_id AND
a.evalue = tmp.evalue
GROUP BY unique_est_id;
SELECT a.*
FROM blast_hit_master_seq2_unique_est_swiss_prot AS a, tmp2
WHERE
a.unique_est_id = tmp2.unique_est_id AND
a.score = tmp2.score;
You can find this method of grouping under section 12.6 of
the MySQL Cookbook: Finding Rows Containing Per-Group
Minimum or Maximum Values.
____________________________________________________________
Eamon Daly
NextWave Media Group LLC
Tel: 1 773 975-1115
Fax: 1 773 913-0970
----- Original Message -----
From: "Tristan Fiedler" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Thursday, January 29, 2004 7:45 PM
Subject: SELECT statement w/ Min() & Group By
> Greetings MySQL group:
>
> I am new to the group so if this is posted to the wrong place, please
> inform me.
>
>
> Using the following table :
>
> +---------------+------------+-------+--------+
> | unique_est_id | sp_id | score | evalue |
> +---------------+------------+-------+--------+
> | 2 | RL24_CICAR | 100 | 2e-21 |
> | 2 | RL24_ARATH | 99 | 5e-21 |
> | 2 | RL24_KLULA | 99 | 5e-21 |
> | 2 | RL24_HUMAN | 171 | 6e-43 |
> | 2 | R24A_YEAST | 97 | 2e-20 |
> | 2 | R24B_YEAST | 96 | 3e-20 |
>
> | 6 | RS10_SULSO | 69 | 4e-12 |
> | 6 | RS10_SULTO | 69 | 6e-12 |
> | 6 | RS10_SULAC | 69 | 6e-12 |
> | 6 | RS10_BORBU | 63 | 2e-10 |
> | 6 | RS10_VIBPA | 58 | 8e-09 |
> | 6 | RS10_PYRAE | 72 | 4e-13 |
> | 6 | RS10_CAMJE | 57 | 2e-08 |
> | 6 | RS10_XANCP | 56 | 3e-08 |
>
> | 8 | MIP_DROME | 53 | 1e-06 |
> | 8 | SM34_LYTPI | 57 | 1e-07 |
> +---------------+------------+-------+--------+
>
>
> I would like to :
>
> For each distinct unique_est_id, get the minimum e-value **and** the score
> and sp_id associated with that e-value. I assume something similar to :
>
> mysql> select unique_est_id, sp_id, score, min(evalue) from
> blast_hit_master_seq2_unique_est_swiss_prot group by unique_est_id ;
>
> The min(evalue) function properly returns the smallest e-value for each
> unique_est_id, however, how do I then select the sp_id and score
> associated with this evalue?
>
> Many thanks!
> --
> Tristan J. Fiedler, Ph.D.
> Postdoctoral Research Fellow - Walsh Laboratory
> NIEHS Marine & Freshwater Biomedical Sciences Center
> Rosenstiel School of Marine & Atmospheric Sciences
> University of Miami
>
> [EMAIL PROTECTED]
> [EMAIL PROTECTED] (alias)
> 305-361-4626
>
> --
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe:
http://lists.mysql.com/[EMAIL PROTECTED]
>
--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]