【问题标题】:Mysql Select Next & Prev row not order by idMysql Select Next & Prev row not order by id
【发布时间】:2011-05-26 14:29:50
【问题描述】:

我有一个按 NAME 排序的查询,它返回如下 smt:

 ID     NAME
2121927 AAA
2123589 AAB
2121050 AAC
2463926 BBB ---> known ID
2120595 CCC
2122831 DDD
2493055 EEE
2123583 EEF

我需要知道已知 ID && NAME 的下一个 ID 和上一个 ID(如果存在) 只有 1 个查询怎么可能?

【问题讨论】:

标签: mysql select row next


【解决方案1】:
  SELECT *,
         'next'
    FROM table
   WHERE `name` > 'BBB'
ORDER BY `name`
   LIMIT 1

UNION

  SELECT *,
         'previous'
    FROM table
   WHERE `name` < 'BBB'
ORDER BY `name` DESC
   LIMIT 1

如果您不知道特定的 BBB name 字段值 - 您可以将其替换为像 SELECT name FROM table WHERE id = 42 这样的子查询,其中 42 是已知的 ID 值。

【讨论】:

  • 大声笑,对不起 :) 我下一行的结果是正确的,上一行是第一行,因为我是按 ASC 而不是 DESC 订购的。
  • @Matěj Koubík:你需要添加另一列以保持一致性,例如主键
  • 我自己发现了:SELECT * FROM table WHERE name &gt;= 'a' AND (name &gt; 'a' OR id &gt; 123) ORDER BY name, id LIMIT 1 选择 id = 123, name = 'a' 之后的下一条记录(名称不必是唯一的)。
【解决方案2】:

我是这样做的:
它不是最快的,但它不关心字段的顺序。
按您想要的顺序查询 db 中的所有行。
使用 php foreach 查找当前 id。
获取当前id的数组索引,使索引+1或索引-1。

$current_id = 6;
$data = get_all_data_from_db();
foreach($data as $index=&gt;$row) {
if($current_id == $row['id']) {
$next = $index+1;
$prev = $index-1;
}
$previous_row = $data[$prev];
$next_row = $data[$next];

【讨论】:

  • 认真的吗? foreach ?在接受的答案中,有一个很好的干净解决方案,使用两个简单查询的UNION
猜你喜欢
  • 2015-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
相关资源
最近更新 更多