2009-06-02 12 views
22

私の目的は、(1,2,3,4,5)、( 'a'、 'b'、 'c'、 'anything')のような値リストから複数の行を取得することです。そうです。mysql fake select

mysql> select id from accounts where id in (1,2,3,4,5,6); 
+----+ 
| id | 
+----+ 
| 1 | 
| 2 | 
| 3 | 
| 5 | 
| 6 | 
+----+ 
5 rows in set (0.00 sec) 

上記のSQLはきっと大丈夫ですが、私の質問は:

はテーブルを指定せずに同じ結果を取得する方法があり、ここで私の目的は、id_set

で行を伝播するだけなので?

別の例:この例は、テーブルを指定せずに単一の行結果を伝播

mysql> select now() as column1; 
+---------------------+ 
| column1    | 
+---------------------+ 
| 2009-06-01 20:59:33 | 
+---------------------+ 
1 row in set (0.00 sec) 

mysql> 

(1,2,3,4,5,6)のような文字列から複数の行をどのように伝播するのですか?

このような何かが動作するはず
+0

どの行ですか?行はテーブルに存在します。テーブルがなければ行はありません。 – jmucchiello

+0

私は自分の質問を更新しました。この時間が明確になることを祈っています:) – omg

答えて

22

:DUAL:

SELECT * 
FROM (
    SELECT 0 as id 
    UNION SELECT 1 
    UNION SELECT 2 
    UNION SELECT 3 
    UNION SELECT 4 
    UNION SELECT 5 
) 
+1

これはかなり緩やかですが、このクエリを書くよりコンパクトな方法はありますか? – omg

+0

なぜselect *?内側のクエリだけで十分にうまくいくはずです。 –

+0

アレックス・マルテッリのような整数テーブルを利用するのは簡単ではありませんが、これは単一のクエリで得ることができるほどコンパクトです。あなたはテンポラリテーブルを作成し、INSERT INTO ... VALUES((1)、(2)、(3)、(4)、(5)(6))などを使用して、そのテンポラリテーブルからSELECTを使用できます。それは少しコンパクトに見えますが、機能的には、オーバーヘッドが増えます。 – eksortso

6

MySQLはダミーのテーブルを持っています。 DUALを使用しても何も変更されません(これは単なる便宜のためです)。このクエリは機能しません。

あなたがしようとしていることを達成するためのより良い方法があると確信しています。あなたの問題を説明すると、私たちは助けてくれるかもしれません。

+1

ありがとう! where節で定数を選択するにはDUALが必要でした。オプションで定数を挿入するためのハックです。 – Jay

1

これはまさにあなたの質問に答えていませんが、私は、これはあなたの実際の問題を修正すると信じて...

SETの@counter = 0; SELECT(@カウンタ:=カウンター+1カウンター)...残りのクエリ

+0

私のデモは整数を使用していますが、整数だけに限定されず、( 'a'、 'b'、 'anything'のような)文字列リストでもかまいません – omg

+0

テンポラリテーブルを使用すると思います=) – Evert

+0

巨大なものに蓄積する、私は恐れている – omg

0

貴重な貴重な情報はan "integers table"です。これを含めて、すべての種類の簡単な処理を簡単に行うことができます(xaprbこのテクニックと密接に関連する "ミューテックステーブル"に関するいくつかのブログ記事を書いています)。

+0

私は、使用後に毎回テーブルをクリアする必要があるので、安定しているとは思わない。 – omg

+0

@Shore、なぜあなたは毎回整数テーブルをクリアする必要がありますか?可能であれば、テーブルを永久にし、必要に応じてテーブルを選択することができます。 – eksortso

+0

これは、リストから行を伝播させる唯一の方法であると言えます。たとえば、テーブルでなければならないとします。 – omg

0

単純で古き良き方法は、連続する値を保持するテーブルを使用することです。

DROP TABLE IF EXISTS `range10`; 
CREATE TABLE IF NOT EXISTS `range10` (
    `id` int(11) NOT NULL, 
    KEY `id` (`id`) 
) ENGINE=MyISAM; 
INSERT INTO `range10` (`id`) VALUES (1),(2),(3),(4),(5),(6),(7),(8),(9),(10); 

一度インストールすると、次のようにクエリを書くことができます。

は毎秒行を取得:

select * from your_data_table where id in (
SELECT id*2 as id FROM `range10` WHERE id in(
    select id from `range10` 
) 
) 

は、1101年から1111年に行を取得する:

select * from your_data_table where id in (
SELECT id+1100 as id FROM `range10` WHERE id in(
    select id from `range10` 
) 
) 

あなたはより大きな範囲を必要としているのであれば、そしてちょうどサイズを大きくテーブル範囲10の連続する値の クエリは簡単で、コストは低く、ストアドプロシージャや関数は必要ありません。

注:

あなたも、連続したchar値で表を作成することができます。しかし内容を変えることはそれほど簡単ではありません。