2011-10-30 36 views
1

我想從一個表運行一個查詢,其中的內容是這樣的:MySQL的:周圍id列間隔並返回從子查詢另一個多列

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-1id+1。子查詢的作品,但我想我有一個查詢本身的問題,因爲我有一個錯誤「操作數應該只包含一列」。我理解它,但我沒有看到任何其他方式在一個查詢中做到這一點?

我敢肯定有一個非常簡單的解決方案,但我不能算出它的那一刻,甚至有細心閱讀倍數列的子查詢其他職位後...

感謝您的幫助:-)

回答

1

我能想到做到這一點,現在唯一的辦法是這樣的:

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

謝謝,它的工作原理和沒有執行問題的時間:-) – jozi

0

你的問題是,您檢索兩個值 - 但作爲一個列表,而不是一組。 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' 
) 
+0

謝謝!它確實有效,但卻需要太多的時間才能執行(例如在一張4000毫米的桌子上20秒)! – jozi