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 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 に答える
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 に答える