我有链接到系列(多对多)的指南,带有这样的联结表:
导游
id etc.. (more columns)
--
1
13
21
30
系列
id etc.. (more columns)
--
1
3
4
series_guides (primary key consists of these 3 columns) guide_id 也是唯一的,一个指南只能链接到一个系列一次。
PK series_id PK guide_id PK order
------------ -------- -----
1 13 1
1 21 3
1 1 2
3 30 2
现在我的问题是:当我知道其他指南的 ID 时,如何获得下一个指南?
示例:有人正在阅读指南 13 (guide_id),我需要运行什么查询才能获取该系列的下一个指南。这是指南 1。
到目前为止,这是我尝试过的方法,我认为它确实有效。但是也许有更好的方法来做到这一点?
SELECT
sg2.`order`,
sg2.guide_id
FROM series_guides sg
JOIN series_guides sg2 ON sg2.series_id = sg.series_id
WHERE sg.guide_id = 13 AND sg2.order > sg.`order`
ORDER BY sg2.`order`
LIMIT 1;
任何帮助深表感谢
您的查询是正确的并且确实有效。我认为您可以通过以稍微不同的方式编写它来使意图更清楚一点(尽管这是有争议的)。执行计划(在 MariaDB 上)完全相同。
中间的注释应该是解释性的:
这会给你:
如果您将 the 更改
guide_id
为 1,您将获得下一个值:在这里检查dbfiddle上的所有内容
备注和(简化的)表格定义:
我用不同的命名定义了表,以避免混淆(并且为了以防万一,不要与
ORDER
关键字冲突):如果
guide_id
必须是UNIQUE
(并且NOT NULL
,否则,它没有任何意义)它已经是一个candidate key
. 作为最简单candidate key
的,它是我将用作的那个primary key
:您可能还希望有另一个限制:
UNIQUE (guide_id, ord)
同样,为了避免您的订单可能未明确定义的情况。