mysql 可以按字母顺序选择下一条记录,但如果记录名称相同,会发生什么情况?

wb1gzix0  于 12个月前  发布在  Mysql
关注(0)|答案(3)|浏览(449)

有了这个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章会被淘汰

yuvru6vn

yuvru6vn1#

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

gorkyyrv

gorkyyrv2#

尝试这样的条件:

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

5w9g7ksd3#

这是因为您正在使用大于运算符比较 names,这将排除任何等于的名称。如果你想继续尊重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作为相同名称的情况下的平局决胜局。

相关问题