我有一张桌子people
id name
----+-----
54 Tango
76 Alpha
95 Radio
在网络上显示记录时,这些名称按字母顺序排列
Alpha, Radio, Tango
假设我们正在查看详细信息并希望使用一些链接Radio
导航到下一个(Tango)
或上一个记录。(Alpha)
我怎样才能找到那些id's
来创建所需的链接?
寻找下一个上级或下级是id
行不通的。
这可能吗?
谢谢。
它还没有这样做。
上一页
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
你可以这样做:
SELECT name
FROM
(
SELECT name, (@rownum := @rownum + 1) rank
FROM people, (SELECT @rownum := 0) t
ORDER BY name
) t WHERE rank = @n
您应该使用新的排名数字列rank
来创建这些链接。然后你应该控制参数的值@n
来获取上一个或下一个。
您可以使用 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, 'Obama'} 开头并且您的数据包括
{ 50, 'Romney'}
{150, 'Romney'}
{843, 'Romney'}
如果名称可以重复,当您要查找上一行和下一行时,如何识别“当前”行?我假设您通过 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 |
+----+-------+
这是最干净,最有效的方法:下一步:
select min(name) people where name > 'RADIO';
要获得上一个:
select max(name) people where name < 'RADIO';