MySQL: интервал вокруг столбца id и возврат другого из подзапроса с несколькими столбцами - PullRequest
1 голос
/ 31 октября 2011

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

id | col1 | col2 | col3
-----------------------
1  | i_11 | i_12 | i_13
2  | i_21 | i_22 | i_23
3  | i_31 | i_32 | i_33
.. | ...  | ...  | ...

SELECT col1 FROM table WHERE id IN
(SELECT id-1, id+1 FROM table WHERE col1='xxx' AND col2='yyy' AND col3='zzz')

Цель состоит в том, чтобы получить интервал [id-1, id+1] на основе столбца id, который возвращает содержимоехранится в col1 для id-1 и id+1.Подзапрос работает, но я думаю, что у меня есть проблема с самим запросом, так как у меня ошибка «Операнд должен содержать только один столбец».Я понимаю, но я не вижу другого способа сделать это в одном запросе?

Я вполне уверен, что есть довольно простое решение, но я не могу понять это в настоящее время, даже после того, каквнимательно прочитав другие посты о подзапросах столбцов множества ...

Спасибо за любую помощь: -)

Ответы [ 2 ]

1 голос
/ 31 октября 2011

Единственный способ, которым я могу думать, сделать это прямо сейчас, это:

SELECT col1 
FROM table T
WHERE id BETWEEN (SELECT id FROM table WHERE col1='xxx' AND col2='yyy' AND col3='zzz') -1 
    and (SELECT id FROM table WHERE col1='xxx' AND col2='yyy' AND col3='zzz') +1
0 голосов
/ 31 октября 2011

Ваша проблема в том, что вы получаете два значения - но не как набор, а как список.Оптимизатор SQL не может видеть 1,3 как набор из двух элементов, когда они представлены в одной строке.Может также потребоваться приведение.

Это должно сработать.

SELECT col1 FROM table WHERE id in 
(
    select cast(id as int) -1 from table where col1='i_21'
    union
    select cast(id as int) +1 from table where col1='i_21'
)
...