使用此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将被跳过。
答案 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