2011-10-30 2 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-1およびid+1col1に格納されたコンテンツを戻すid列に基づいています。副問合せは機能しますが、「オペランドには1つの列しか含める必要がありません」というエラーが発生しているため、問合せ自体に問題があります。私はそれを理解していますが、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

あなたの問題は、2つの値を取得していることである - しかし、リストではなく、セットとして。 SQLオプティマイザは、1,3行が1つの行に表示されている場合、1つのアイテムを2つのアイテムのセットと見なすことはできません。キャストが必要な場合もあります。

これは動作するはずです。

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

ありがとう!それは実際には機能しますが、実行するまでに多くの時間がかかります(4000rowsのテーブルの20秒のように!)。 – jozi

関連する問題