可以按字母顺序选择下一条记录,但当记录名称相同时会发生什么?

时间:2011-03-10 03:32:01

标签: mysql select next

使用此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
伯特13和17将被跳过。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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作为打破平局。

答案 2 :(得分:1)

尝试这样的条件:

WHERE `name` > (SELECT `name` FROM `names` WHERE `id` = X)
      OR `name` = (SELECT `name` FROM `names` WHERE `id` = X) AND `id` > X