You could probably use a subquerry to backtrack the clienthistory_id.

SELECT
        v.clienthistory_id,
        (SELECT
                MAX(historyvlan_time),
                historyvlan_vlan
        FROM
                pe_historyvlan as v join pe_clienthistory  using 
(clienthistory_id)
        GROUP BY
                historyvlan_vlan order by historyvlan_vlan, historyvlan_time 
desc
FROM
        ...
WHERE
        MAX(historyvlan_time)=historyvlan_time
        AND historyvlan_vlan=historyvlan_vlan


This could work if historyvlan_time and historyvlan_vlan can be treated as
dual primary keys, but I am still new to MySQL and this might need to be
tweaked to work right.  I hope it helps, or gets you moving in a better
direction.


Elton Clark
Project Engineer
IMET Corporation
82 Walker Lane, Suite 100
Newtown, PA  18940
215-860-6081 x5
[EMAIL PROTECTED]


-----Original Message-----
From: Michael Stassen [mailto:[EMAIL PROTECTED]
Sent: Thursday, March 17, 2005 12:17 AM
To: Daevid Vincent
Cc: mysql@lists.mysql.com
Subject: Re: Erroneus column using MAX() and GROUP BY


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