You've misunderstood how GROUP BY and MAX() work. GROUP BY divides your data into groups, and aggregate functions such as MAX() tell you something about each group, but they *do not* return *rows* from your table. Consider the following example rows in a larger table:

  cat   val1   val2
   4      1      1
   4      5      3
   4      7      2
   4      3      4
   4      7      1

Now consider the query

  SELECT cat, MIN(val1), MAX(val1), MIN(val2), MAX(val2)
  FROM mytable
  GROUP BY cat;

I think it should be easy to see that for the group where cat is 4, I'll get the following result:

  +-----+-----------+-----------+-----------+-----------+
  | cat | MIN(val1) | MAX(val1) | MIN(val2) | MAX(val2) |
  +-----+-----------+-----------+-----------+-----------+
  |   4 |         1 |         7 |         1 |         4 |
  +-----+-----------+-----------+-----------+-----------+

Which row is that in my table? You see? Even if I only asked for MAX(val1), there are 2 rows with the max value of 7. AS I said before, we get information about each group, but not rows from the table.

Other systems wouldn't even allow your query, because clienthistory_id is neither an aggregate function nor a grouped column. MySQL allows this as a convenience, but you are warned not to use columns whose values are not unique per group, as you will get random (first found, I believe) results. See the manual for more <http://dev.mysql.com/doc/mysql/en/group-by-hidden-fields.html>.

Fortunately, yours is such a frequently asked question, that the manual has a page describing three solutions. See <http://dev.mysql.com/doc/mysql/en/example-maximum-column-group-row.html>.

Michael


Daevid Vincent wrote:

I have this table:

mysql> select historyvlan_time, historyvlan_vlan, v.clienthistory_id from
pe_historyvlan as v join pe_clienthistory  using (clienthistory_id) order by
historyvlan_vlan, historyvlan_time desc;
+------------------+------------------+------------------+
| historyvlan_time | historyvlan_vlan | clienthistory_id |
+------------------+------------------+------------------+
|       0503011446 |                4 |               55 |  <--
|       0503011440 |                4 |               54 |
|       0502181640 |                4 |               29 |
|       0502181638 |                4 |               26 |
|       0502181508 |                4 |               24 |
|       0503021500 |                5 |               73 |  <--
|       0503011808 |                6 |               71 |  <--
|       0503011452 |                6 |               56 |
|       0502181626 |                6 |               25 |
|       0502181640 |                7 |               28 |  <--
|       0503011805 |                8 |               70 |  <--
|       0503011801 |                8 |               68 |
|       0503011731 |                8 |               61 |
|       0503011730 |                8 |               60 |
+------------------+------------------+------------------+
14 rows in set (0.00 sec)

I am trying to find the id and vlan for the most recent time:

mysql> select max(historyvlan_time), historyvlan_vlan, v.clienthistory_id
from pe_historyvlan as v join pe_clienthistory using (clienthistory_id)
group by historyvlan_vlan order by historyvlan_vlan, historyvlan_time desc;
+-----------------------+------------------+------------------+
| max(historyvlan_time) | historyvlan_vlan | clienthistory_id |
+-----------------------+------------------+------------------+
| 0503011446 | 4 | 24 | <--
| 0503021500 | 5 | 73 |
| 0503011808 | 6 | 25 | <--
| 0502181640 | 7 | 28 | | 0503011805 | 8 | 60 | <--
+-----------------------+------------------+------------------+
5 rows in set (0.00 sec)



Why do I get '24' when I should get '55', '25' when I should get '61', and '60' when I should get '70'.



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



Reply via email to