1

我有一个名为 books 的表,其中包含以下数据:

id | description | section
 1 | textbook 1  |  1
 2 | textbook 2  |  1
 3 | textbook 3  |  1

我使用以下查询来选择 id 2 以及第 1 节中的下一行和上一行:

SELECT id FROM books where id IN
(2,
(SELECT id FROM books WHERE id < 2 LIMIT 1),
(SELECT id FROM books WHERE id > 2 LIMIT 1)
)
AND section = 1

当我添加时section = 1,查询只返回 id 2,而它应该返回所有 3 个 id,但是当我删除这部分时,它会选择所有 3 个 id。我的方案实际上比这更复杂,但我简化了它来解释情况。那么,我在上面做错了什么?

4

3 回答 3

2
(SELECT id
FROM books
WHERE id < 2 and section = 1
ORDER BY id DESC
LIMIT 1)

UNION 

(SELECT id
FROM books
WHERE id >= 2 and section = 1
ORDER BY id ASC
LIMIT 2)

您的查询的问题是您选择了小于 2 和大于 2 的随机 id,而没有考虑该部分。如果这些 ID 不在第 1 部分中,它们将不会包含在结果中。

外部查询中的 WHERE 子句不会分布到子查询中。子查询独立执行,返回 ID,将其放入IN子句中。然后外部查询按部分过滤。

小提琴

于 2013-06-11T07:06:57.367 回答
0
SELECT id FROM books where id IN
(2,
(SELECT id FROM books WHERE id < 2 ORDER BY id DESC LIMIT 1),
(SELECT id FROM books WHERE id > 2 ORDER BY id ASC LIMIT 1)
)
AND section = 1

应该做的ORDER BY伎俩。

于 2013-06-11T07:19:53.990 回答
0

我很确定这可以解决您的问题:

SELECT id
FROM books
WHERE id IN
(2
, ((SELECT id FROM books WHERE id < 2 AND section = 1 ORDER BY id DESC LIMIT 1))
, ((SELECT id FROM books WHERE id > 2 AND section = 1 ORDER BY id ASC LIMIT 1))
)
AND section = 1
于 2013-06-11T07:31:22.753 回答