找到最后一行

时间:2010-06-22 10:30:36

标签: sql mysql

我需要一些查询帮助。

我有这个简单的表格:

CREATE TABLE `consecutiv` (
  `id` int(11) NOT NULL auto_increment,
  `readVal` int(11) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=16 DEFAULT CHARSET=latin1;


insert  into `consecutiv`(`id`,`readVal`) values (1,2),(2,2),(3,2),(5,3),(6,3),(7,3),(8,3),(9,4),(10,5),(11,6),(12,6),(13,2),(14,2),(15,6);

看起来像这样:

id  readVal
    1   2
    2   2
    3   2
    5   3
    6   3
    7   3
    8   3
    9   4
   10   5
   11   6
   12   6
   13   2
   14   2
   15   6

我想获得给定的readVal最后一行:

在上面的示例中将是:

id:3表示readVal = 2

id:8表示readVal = 3

...

我尝试了这个查询:

SELECT consecutiv.id, consecutiv.readVal, c.id, c.readVal  FROM consecutiv 
JOIN consecutiv c ON consecutiv.id = c.id-1
WHERE consecutiv.readVal!=c.readVal ORDER BY consecutiv.id ASC

只要系列中没有丢失的id,它就能正常工作。在上面的示例中,id no 4缺失,查询不会返回预期的结果。

谢谢!

1 个答案:

答案 0 :(得分:3)

SELECT a.id, a.readVal 
FROM consecutiv a
WHERE a.readVal != 
   (SELECT b.readVal 
    FROM consecutiv b 
    WHERE b.id > a.id 
    ORDER BY id ASC
    LIMIT 1)
ORDER BY a.id;

返回:

 id | readval
----+---------
  3 |       2
  8 |       3
  9 |       4
 10 |       5
 12 |       6
 14 |       2

对于最后一行也是需要的情况:

SELECT c.id, c.readVal, c.nextReadVal
FROM 
  (SELECT 
   a.id, a.readVal, 
     (SELECT b.readVal
      FROM consecutiv b 
      WHERE b.id > a.id 
      ORDER BY id ASC 
      LIMIT 1) AS nextReadVal
   FROM consecutiv a) AS c
WHERE readVal != nextReadVal OR nextReadVal IS NULL
ORDER BY c.id;

返回:

 id | readval | nextreadval
----+---------+-------------
  3 |       2 |           3
  8 |       3 |           4
  9 |       4 |           5
 10 |       5 |           6
 12 |       6 |           2
 14 |       2 |           6
 15 |       6 |