You aren't making any mistakes, it's just not possible to do. You can't rely
on which row MySQL will return when using a GROUP BY clause.

The standard method would be to do something like this:

    CREATE TEMPORARY TABLE mytemptable
    SELECT max(myindex) as myindex, mycat
    FROM `mytest`
    GROUP BY mycat;

then
    SELECT myval, myotherrows, mycat
    FROM `mytemptable`
    LEFT JOIN mytest USING(myindex,mycat)

note: I haven't tested the above code, it's just an example of the theory

Chris
-----Original Message-----
From: Noah Spurrier [mailto:[EMAIL PROTECTED]
Sent: Wednesday, April 21, 2004 10:35 AM
To: [EMAIL PROTECTED]
Cc: [EMAIL PROTECTED]; [EMAIL PROTECTED]
Subject: Confused by max and group by



I'm having trouble with "max()" and "group by".
It seems pretty simple. I hope someone can point out my mistake.
I want to select the max index of a group.
In other words, I want to find the last record added for each group.
The problem I'm having is that the columns of the resulting rows
are mixed with different records. I get the expected indexes
returned, but the fields appear to be from another record and
not the fields associated with the index.

I ran this query:
    SELECT max(myindex), myval, mycat
    FROM `mytest`
    GROUP BY mycat;

and I get the following results:
    +--------------+-------+-------+
    | max(myindex) | myval | mycat |
    +--------------+-------+-------+
    | 3            | one   | A     |
    | 9            | one   | B     |
    +--------------+-------+-------+

But I was expecting this:
    +--------------+-------+-------+
    | max(myindex) | myval | mycat |
    +--------------+-------+-------+
    | 3            | one   | A     |
    | 9            | three | B     |
    +--------------+-------+-------+

This is my test data.

CREATE TABLE `mytest`(
  `myindex` int(11)   NOT NULL default '0',
  `myval` varchar(40) NOT NULL default '',
  `mycat` varchar(40) NOT NULL default '',
  PRIMARY KEY  (`myindex`)
) TYPE=MyISAM;

INSERT INTO `mytest` VALUES (1, 'one',   'A');
INSERT INTO `mytest` VALUES (2, 'two',   'A');
INSERT INTO `mytest` VALUES (3, 'three', 'A');
INSERT INTO `mytest` VALUES (4, 'one',   'B');
INSERT INTO `mytest` VALUES (5, 'two',   'B');
INSERT INTO `mytest` VALUES (6, 'three', 'B');
INSERT INTO `mytest` VALUES (7, 'one',   'B');
INSERT INTO `mytest` VALUES (8, 'two',   'B');
INSERT INTO `mytest` VALUES (9, 'three', 'B');

Yours,
Noah

--
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]

Reply via email to