1

使用此 sql,我可以使用 ID 按字母顺序获取下一个名称

SELECT id 
FROM `names` 
WHERE `name` > (SELECT `name` FROM `names` WHERE `id` = X) 
ORDER BY `name` ASC, `id` ASC

但是让我们假设我有这些我有这些记录

id | name
---------
12 | Alex
8  | Bert
13 | Bert
17 | Bert
4  | Chris

假设我有 id 12 作为参考,我得到了结果

id | name
---------
8  | Bert
13 | Bert
17 | Bert
4  | Chris

但是如果我使用 8 作为参考,我会得到

id | name
---------
4  | Chris

Bert 13 和 17 将被跳过。

4

3 回答 3

2

这似乎很明显,但如果您想按 2 个字段(例如名字和姓氏)排序,那么您需要连接 ( CONCAT/ CONCAT_WS) 名字和姓氏字段以查找上一个或下一个结果。如果您有相同的名称,那么您可能会发现自己从一个名称循环到另一个名称并再次返回,为防止这种情况,请将行的 ID 连接到连接的名字和姓氏的末尾。这将比测试 id 是否大于当前 id 更好,(OR n.names = q.name AND n.id > q.id)因为如果名称没有按字母顺序插入,那么您将错过部分结果(不是浏览到下一个/上一个结果时想要的)。希望这可以帮助某人。

于 2011-06-09T13:33:54.403 回答
1

那是因为您将名称与大于运算符进行比较,这将排除任何等于的名称。如果您想继续尊重 id:

SELECT n.id 
FROM names n
JOIN (SELECT name, id FROM names WHERE id = X) q
  ON n.id = q.id
WHERE n.name > q.name
   (OR n.names = q.name AND n.id > q.id)
ORDER BY n.name ASC, n.id ASC

这里我们使用内部查询不仅返回名称,还返回相应的 id。然后,在名称相同的情况下,我们可以将 id 用作决胜局。

于 2011-03-10T03:37:14.380 回答
1

试试这样的条件:

WHERE `name` > (SELECT `name` FROM `names` WHERE `id` = X)
      OR `name` = (SELECT `name` FROM `names` WHERE `id` = X) AND `id` > X
于 2011-03-10T03:38:05.413 回答