在sql中按字母顺序排列时查找上一个/下一个记录?

时间:2012-11-30 18:19:23

标签: mysql sql

我有一张表people

id    name
----+-----
54    Tango
76    Alpha
95    Radio

在网络上显示记录时,这些名称按字母顺序排列

Alpha, Radio, Tango

假设我们正在查看Radio个详细信息,并希望使用某些链接导航到下一个(Tango)或prevoius (Alpha)记录。

如何找到id's来创建所需的链接?

找到下一个上级或下级id将不起作用。

这可能吗?

感谢。

5 个答案:

答案 0 :(得分:4)

你可以这样做:

SELECT name
FROM
(
   SELECT name, (@rownum := @rownum + 1) rank
   FROM people, (SELECT @rownum := 0) t
   ORDER BY name
) t WHERE rank = @n

您应该使用新的排名编号列rank来创建这些链接。然后你应该控制参数@n的值来获得前一个或下一个。

SQL Fiddle Demo

答案 1 :(得分:4)

尚未这样做。

分组

SELECT Id FROM people WHERE name < 'Radio' ORDER BY name DESC LIMIT 1

SELECT Id FROM people WHERE name > 'Radio' ORDER BY name ASC LIMIT 1

答案 2 :(得分:0)

您可以使用max()选择以前的名称。

select max(name) as name
from people
where name < 'Radio';

然后,您可以将该查询用作JOIN中的派生表。

select id
from people
inner join 
  (select max(name) as name
   from people
   where name < 'Radio') as t2 on t2.name = people.name

下一个名称类似,使用min()和>运算符。

如果您的设计允许重复名称,派生表将返回多行。这通常是人工钥匙的问题。

当您从{100,'奥巴马'}开始, next 意味着什么,并且您的数据包括

{ 50, 'Romney'}
{150, 'Romney'}
{843, 'Romney'}

答案 3 :(得分:0)

如果名称可以重复,当您想要查找上一行和下一行时,如何识别“当前”行?我假设您通过id识别它。无论如何,您需要有一些方法来唯一地处理行。

我测试了这个:

USE test;
DROP TABLE IF EXISTS t;
CREATE TABLE t (id INT PRIMARY KEY, name VARCHAR(10));

INSERT INTO t (id, name) VALUES
(54, 'Tango'),
(76, 'Alpha'),
(78, 'Alpha'),
(95, 'Radio');

(SELECT * FROM t WHERE id >= 76 ORDER BY id ASC LIMIT 2)
UNION
(SELECT * FROM t WHERE id <= 76 ORDER BY id DESC LIMIT 2)
ORDER BY id ASC;

UNION负责消除id = 76

的重复行

结果如下:

+----+-------+
| id | name  |
+----+-------+
| 54 | Tango |
| 76 | Alpha |
| 78 | Alpha |
+----+-------+

答案 4 :(得分:0)

这是最干净,最有效的方式: 下一步:

 select min(name) people where name > 'RADIO';

要获得上一个:

 select max(name) people where name < 'RADIO';