在Mysql中选择相邻的记录

时间:2010-09-13 05:11:56

标签: php select mysql

假设此表按日期排序

id      | date      | customer
3       | 2009-10-01| Frank
1       | 2010-10-11| Bob
4       | 2010-11-01| Mitchel
2       | 2010-11-02| Jim

我想进行查询,以便知道ID = 4,结果行是

$row[0]['id'] == 1 //previous
$row[1]['id'] == 4 //most recent/current
$row[2]['id'] == 2 //next

仅限mysql的解决方案最好,但是如果有一个优雅的php解决方案也会很酷。

3 个答案:

答案 0 :(得分:4)

由于表格按date列排序,您可以运行以下查询来获取它:

  • 上一行:

    select * from tablename where `date` < (select `date` from tablename where id=4) order by `date` desc limit 1
    
  • 对于当前行:

    select * from tablename where id=4
    
  • 下一行:

    select * from tablename where `date` > (select `date` from tablename where id=4) order by `date` asc limit 1
    

输出:这三个查询返回结果(逐个),如下所示:

id  date       customer
1   2010-10-11  Bob
4   2010-11-01  Mitchel
2   2010-11-02  Jim

答案 1 :(得分:1)

由于您按日期排序,但基于您希望id上相邻行的行,您将不得不进行2次查询。第一个确定您选择的ID的日期,第二个确定相邻的行。

第1步 - 获取日期

Select date
FROM   yourtable
WHERE id = 4

第2步 - 获取所有行

SELECT *
FROM   yourtable
WHERE date IN (  (select MAX( date ) from yourtable where date < $datefromquery1)
                 , $datefromquery1
                 , (select MIN( date ) from yourtable where date > $datefromquery1)
                )

答案 2 :(得分:0)

LIMIT函数可以使用两个参数,即返回的偏移量和行数。在您的情况下,您希望偏移量(具有所需行之前的日期的行数) - 1,或者在这种情况下2 - 1 = 1,并且行数为3。所以你想要的SQL是

SELECT * FROM customers ORDER BY date ASC LIMIT 1,3;

,数字“1”将是查询的结果

SELECT COUNT(*)-1 FROM customers WHERE date > "2010-11-01";

我不相信MySQL会让你使用子选择或函数值作为LIMIT的参数,所以你必须使用PHP存储它并以这种方式构造下一个查询。