DROP TABLE IF EXISTS `aaa`;
CREATE TABLE `aaa` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`akey` bigint(20) NOT NULL,
`avalue` bigint(20) NOT NULL,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录日期',
PRIMARY  KEY(`id`)
)ENGINE=InnoDB CHARSET=utf8;
INSERT INTO aaa(akey,avalue,time)VALUES
(1,2,'2010-10-09 15:58:20'),
(1,2,'2010-10-09 15:58:21'),
(1,2,'2010-10-09 15:58:22'),
(2,2,'2010-10-09 15:58:20'),
(2,2,'2010-10-09 15:58:21'),
(2,1,'2010-10-09 15:58:28');
我想根据akey和avalue两个条件进行判断查询,只要满足他们两个值都相等记录的最新一条就行,
例如
(1,2,'2010-10-09 15:58:20'),
(1,2,'2010-10-09 15:58:21'),
(1,2,'2010-10-09 15:58:22'),
这三条记录都一样的,key与value都相等,我要取最新一条记录,也就是最后一条,mysql语句怎么写?

解决方案 »

  1.   

     select * from aaa where akey=avalue order by time desc limit 1;
      

  2.   

    update aaa a,(select max(id),akey,avalue,max(time) as time1 from aaa Group by akey,avalue order by id,time1) b
    set time=b.time1
    where a.akey=b.akey and a.avalue=b.avalue;
      

  3.   


    select * from aaa t where not exists(select 1 from aaa where  aaa.akey=t.avalue and aaa.time>t.time)
      

  4.   


    这个语句应该不是LZ 所需要的。 我想根据akey和avalue两个条件进行判断查询,只要满足他们两个值都相等记录的最新一条就行,
    例如
    (1,2,'2010-10-09 15:58:20'),
    (1,2,'2010-10-09 15:58:21'),
    (1,2,'2010-10-09 15:58:22'),
    这三条记录都一样的,key与value都相等,我要取最新一条记录,也就是最后一条,mysql语句怎么写?
      

  5.   

    参考下贴中的多种方法http://topic.csdn.net/u/20091231/16/2f268740-391e-40f2-a15e-f243b2c925ab.html
    [征集]分组取最大N条记录方法征集,及散分....
      

  6.   

    其中的两种解法。select * from aaa t
    where not Exists (select 1 from aaa where akey=t.akey and avalue=t.avalue and `time`>t.time);mysql> select * from aaa t
        -> where not Exists (select 1 from aaa where akey=t.akey and avalue=t.avalue
     and `time`>t.time);
    +----+------+--------+---------------------+
    | id | akey | avalue | time                |
    +----+------+--------+---------------------+
    |  3 |    1 |      2 | 2010-10-09 15:58:22 |
    |  5 |    2 |      2 | 2010-10-09 15:58:21 |
    |  6 |    2 |      1 | 2010-10-09 15:58:28 |
    +----+------+--------+---------------------+
    3 rows in set (0.05 sec)mysql>select *
    from (
    select * from aaa Order by  akey,avalue,time desc
    ) t
    group By akey,avaluemysql> select *
        -> from (
        -> select * from aaa order by  akey,avalue,time desc
        -> ) t
        -> group by akey,avalue;
    +----+------+--------+---------------------+
    | id | akey | avalue | time                |
    +----+------+--------+---------------------+
    |  3 |    1 |      2 | 2010-10-09 15:58:22 |
    |  6 |    2 |      1 | 2010-10-09 15:58:28 |
    |  5 |    2 |      2 | 2010-10-09 15:58:21 |
    +----+------+--------+---------------------+
    3 rows in set (0.00 sec)mysql>
      

  7.   


    update aaa a,(select id,akey,avalue,time as time1 from aaa where id in (select max(id) from aaa group by akey,avalue)) b
    set time=b.time1
    where a.akey=b.akey and a.avalue=b.avalue;
      

  8.   


    想问ACMAIN_CHM: 第一种解法结果在我这里执行结果不对喔, 为什么呢? 第二种解法结果正确。
    mysql> select * from aaa t
        -> where not Exists (select 1 from aaa where akey=t.akey and avalue=t.avalue
     and 'time'=t.time);
    +----+------+--------+---------------------+
    | id | akey | avalue | time                |
    +----+------+--------+---------------------+
    |  1 |    1 |      2 | 2010-10-09 15:58:22 |
    |  2 |    1 |      2 | 2010-10-09 15:58:22 |
    |  3 |    1 |      2 | 2010-10-09 15:58:22 |
    |  4 |    2 |      2 | 2010-10-09 15:58:21 |
    |  5 |    2 |      2 | 2010-10-09 15:58:21 |
    |  6 |    2 |      1 | 2010-10-09 15:58:28 |
    +----+------+--------+---------------------+
    6 rows in set, 1 warning (0.00 sec)
      

  9.   

    select id,akey,avalue,time as time1 from aaa where id in (select max(id) from aaa group by akey,avalue)
      

  10.   

    第一种方法,并不是标准的SQL语句,这个是MYSQL中才有的特色。
    如果你的MYSQL的SQL MODE设置成标准的,则这个语句会报错。当然这是我猜的。 建议提类似这种问题的时候把错误信息同时贴出以供别人分析而不是让别人猜。问题说明越详细,回答也会越准确!参见如何提问。(提问的智慧
      

  11.   


    语句执行并没有报错, 但是结果并不是像你得到的一样, 我已经贴出在12楼。 期望的结果应该是只有3行, 但在我这里执行结果有6行, 也就是说并没有得出想要的结果。 
    另, 没有注意到也不知道如何设置 SQL MODE, 按照安装手册安装好 MYSQL 之后就没有进行过特别的什么设置。 
      

  12.   


    从楼主的条件中, 没有说明 ID 大的记录时间就一定是最晚的, 因此用ID 去判断不一定能得出最准确的结果。  当然楼主的例子中正好是 ID 大, 时间就晚, 只能认为是特例。  
      

  13.   


    哦,看错了。 你的是第一种EXISTS有问题。这个是标准SQL语句。 GROUP BY的是有问题的。select * from aaa ;你的结果是什么?
      

  14.   

    我刚刚又重新运行了一遍, 3个语句, 结果如下:请注意: 第二个语句中 最后部分 我要把 'time' 的单引号去掉,能得到正确结果, 而第三个语句中, 把单引号加回来, 就提示报错, CODE 1292. 我现在也不知道为什么和我12楼的结果会有差别, 疑惑中。。望指教。  
    mysql> select * from aaa t;
    +----+------+--------+---------------------+
    | id | akey | avalue | time                |
    +----+------+--------+---------------------+
    |  1 |    1 |      2 | 2010-10-09 15:58:20 |
    |  2 |    1 |      2 | 2010-10-09 15:58:21 |
    |  3 |    1 |      2 | 2010-10-09 15:58:22 |
    |  4 |    2 |      2 | 2010-10-09 15:58:20 |
    |  5 |    2 |      2 | 2010-10-09 15:58:21 |
    |  6 |    2 |      1 | 2010-10-09 15:58:28 |
    +----+------+--------+---------------------+
    6 rows in set (0.00 sec)mysql> select * from aaa t
        -> where not Exists (select 1 from aaa where akey=t.akey and avalue=t.avalue
     and time>t.time);
    +----+------+--------+---------------------+
    | id | akey | avalue | time                |
    +----+------+--------+---------------------+
    |  3 |    1 |      2 | 2010-10-09 15:58:22 |
    |  5 |    2 |      2 | 2010-10-09 15:58:21 |
    |  6 |    2 |      1 | 2010-10-09 15:58:28 |
    +----+------+--------+---------------------+
    3 rows in set (0.00 sec)mysql> select * from aaa t
        -> where not Exists (select 1 from aaa where akey=t.akey and avalue=t.avalue
     and 'time'>t.time);
    Empty set, 1 warning (0.00 sec)Warning (Code 1292): Incorrect datetime value: 'time' for column 'time' at row 1mysql>
      

  15.   

    select max(id),akey,avalue,max(time) as time1 from aaa Group by akey,avalue order by id,time1
    那这个就是正确的了
      

  16.   

    在mysql中,执行语句中的time加的不是单引号,而是单撇,在键盘第二排第一个键位上的那个符号