----- Original Message ----- 
From: "Dan Bolser" <[EMAIL PROTECTED]>
To: <mysql@lists.mysql.com>
Sent: Monday, April 11, 2005 5:58 AM
Subject: Display 1st row of every group?


>
> I read with great interest this
>
> http://www.artfulsoftware.com/queries.php#4
>
> Display 1st row of every group
>
> SELECT id
> FROM tbl
> GROUP BY id
> HAVING count(*) = 1;
>
Despite what the heading says for that query, it is NOT going to return the
first row of every group. In fact, it is going to return only groups that
contain one row. For example, given this data:

ID
--
5
5
5
6
7
7
8
8
8
9

That query will return return this:

id
--
6
9

In other words, it is returning only groups where there is a single ID with
that value. Note also that it is returning ONLY an ID, not the ID plus the
rest of the row. Their description of what the query does is just plain
wrong.

> I want to use this syntax with an 'order by' like this...
>
>   SELECT *
>     FROM tbl
> GROUP BY id
>   HAVING count(*) = 1
> ORDER BY bleah;
>
> Will this syntax return the row within the "id group" with the smallest
> value of the bleah column? (is it guaranteed to do so?)
>
No, absolutely not. Try it yourself with a small table of sample data and
you will see for yourself.

Your biggest problem is that you are trying to select all the columns of the
table but only grouping on one column. The whole intent of GROUP BY is to
summarize data, not give lots of details, but you are asking for details.

There is probably a way to get what you want but it would take me a fair
while to properly explain GROUP BY to you and I can't spare that much time.

As a temporary expedient, may I suggest that you:
- change the SELECT * clause so that it names only the column(s) in the
GROUP BY, plus any summarizations (SUM(), COUNT(*), AVG(), etc.) you need
- drop the HAVING altogether
- use ORDER BY, if necessary, to make sure that your result set rows come
out in the desired order

Also, be sure to identify which version of MySQL you are using when you post
an SQL question. In many, many cases the answer to an SQL question is "It
depends on which version of MySQL you are using." The later versions, 4.1
and 5.0, have many more options that could be useful for this problem than
the older versions.

Rhino


> Cheers,
> Dan.
>
>
> -- 
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]
>
>
> -- 
> No virus found in this incoming message.
> Checked by AVG Anti-Virus.
> Version: 7.0.308 / Virus Database: 266.9.5 - Release Date: 07/04/2005
>
>



-- 
No virus found in this outgoing message.
Checked by AVG Anti-Virus.
Version: 7.0.308 / Virus Database: 266.9.6 - Release Date: 11/04/2005


-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to