我有一张表people
id name
----+-----
54 Tango
76 Alpha
95 Radio
在网络上显示记录时,这些名称按字母顺序排列
Alpha, Radio, Tango
假设我们正在查看Radio
个详细信息,并希望使用某些链接导航到下一个(Tango)
或prevoius (Alpha)
记录。
如何找到id's
来创建所需的链接?
找到下一个上级或下级id
将不起作用。
这可能吗?
感谢。
答案 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
的值来获得前一个或下一个。
答案 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';