2013-06-11 2 views
1

У меня есть таблица, называемые книги со следующими данными:MYSQL возвращения неполных результатов

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

Я использую следующий запрос, чтобы выбрать идентификатор 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 идентификатора, но когда я удаляю эту часть, он выбирает все 3 идентификатора. Моя схема на самом деле более сложная, но я упростил ее, чтобы объяснить ситуацию. Итак, что я делаю неправильно выше?

+0

не хватает вас часть вашего запроса. – Barmar

+0

Является ли это полным утверждением или это появляется в предложении «IN»? – DaveH

+0

Извините, скорректировано –

ответ

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, не принимая во внимание раздел. Если эти идентификаторы не указаны в разделе 1, они не будут включены в результат.

Предложение WHERE в вашем внешнем запросе не распространяется на подзапросы. Подзапросы выполняются независимо, возвращая идентификаторы, которые помещаются в пункт IN. Затем внешний запрос фильтрует по разделу.

FIDDLE

+0

это должно работать, но я хочу знать, что случилось с моим подзапросы? спасибо :) –

+0

Проверено ли это? – Strawberry

+0

Добавлено объяснение ответа. – Barmar

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 

The ORDER BY должен сделать трюк.

+0

Это не будет работать, если идентификаторы 1 и 3 не указаны в разделе 1. – Barmar

+0

Фактически я заказываю, но он все еще не работает –

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 
Смежные вопросы