mysql - 根据按两个文本列排序的 SQL 获取下一行和上一行

标签 mysql sql

我有这个sql语句:

SELECT * FROM members ORDER BY last_name ASC, first_name ASC LIMIT 0, 10

以上是在索引页上使用的。

在详情页面,我使用

SELECT * FROM members WHERE id = :id

如何根据当前行id获取上一行和下一行? (上一个和下一个按last_name ASC、first_name ASC 排序)

我认为它会是这样的:

SELECT id FROM members WHERE last_name >= : last_name AND id != :id ORDER BY last_name ASC, first_name ASC

但这是不对的。我还需要以某种方式将first_name添加到语句中,并且仅执行first_name>=:first_name是不正确的。

最佳答案

您可以将union allorder bylimit一起使用。以下代码获取第一个子查询中的前一个名称和第二个子查询中的下一个名称:

(select m.*
 from members m
 where last_name < (select last_name from members where id = :id)
 order by last_name desc
 limit 1
) union all
(select m.*
 from members m
 where last_name > (select last_name from members where id = :id)
 order by last_name asc
 limit 1
);

处理名字和姓氏的最简单方法可能是将它们连接在一起:

(select m.*
 from members m
 where concat_ws(' ', last_name, first_name) < (select concat_ws(' ', last_name, first_name) from members where id = :id)
 order by last_name asc, first_name desc
 limit 1
) union all
(select m.*
 from members m
 where concat_ws(' ', last_name, first_name) > (select concat_ws(' ', last_name, first_name) from members where id = :id)
 order by last_name asc, first_name
 limit 1
)

如果名字和/或姓氏中有空格,这可能会产生一些意想不到的结果。我猜数据中不会发生这种情况,但在这种情况下可以使用其他分隔符。

关于mysql - 根据按两个文本列排序的 SQL 获取下一行和上一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28285080/

相关文章:

java - 如果输入不正确,则不允许用户将数据保存到mysql数据库中

mysql find_in_set匹配2列

Nodejs 中的 MySQL 池

sql - 在 SQL Server 中显示 COUNT = 0 的行

mysql - 根据潜在客户的 ID 将所有注释连接到一行中?

php - AJAX 调用 PHP 查询不工作

mysql - 如何获取所有员工第二高工资的记录基数

MySQL 5.5 - 选择记录更改的行

sql - 报告的错误代码是否被认为是 SQL 注入(inject)?

mysql查询: match against using wildcard