5

我有一张桌子people

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

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

Alpha, Radio, Tango

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

我怎样才能找到那些id's来创建所需的链接?

寻找下一个上级或下级是id行不通的。

这可能吗?

谢谢。

4

5 回答 5

5

它还没有这样做。

上一页

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
于 2012-11-30T18:25:18.347 回答
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 小提琴演示

于 2012-11-30T18:25:03.090 回答
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, 'Obama'} 开头并且您的数据包括

{ 50, 'Romney'}
{150, 'Romney'}
{843, 'Romney'}
于 2012-11-30T18:47:15.973 回答
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 |
+----+-------+
于 2012-11-30T19:07:57.037 回答
0

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

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

要获得上一个:

 select max(name) people where name < 'RADIO';
于 2015-06-11T08:25:37.740 回答