次のような「入力」テーブルがあります。
id subId surveyId name val
1 1 1 Ip Addr 123.456.789
2 1 1 Cookie abcdefghij
3 1 1 Time 2012-06-05 22:14:30
4 2 1 Ip Addr 123.456.789
5 2 1 Time 2012-06-05 22:14:40
subId
Submission Id の略です。指定した時間後に特定のすべての提出物を取得したいsurvId
。2つのステップがあります。まず、特定の時間の後にすべての提出 ID を取得します。これは次のように実行できます。
SELECT subId FROM Inputs WHERE surveyId=1 AND name='Time' AND val>'2012-06-05 22:14:35';
次に、これらの送信のすべての行を取得します。
SELECT * FROM Inputs WHERE subId IN (...);
...
を最初のクエリの結果に置き換えると、すべて正常に動作します。最後の 2 行 (id 4 と 5) を返します。EXPLAIN
クエリ 1は次のとおりです。
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE Inputs range Inputs_ix1 Inputs_ix1 1030 (null) 3 Using where
そしてクエリ2:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE Inputs range Inputs_ix2 Inputs_ix2 4 (null) 30 Using where
それらをプロファイリングすると、10,000 行で約 1 ミリ秒かかります。ここまでは順調ですね。しかし、私はそれらを組み合わせたいと思っています。これが私が試したことです:
SELECT * FROM Inputs WHERE subId IN (SELECT subId FROM Inputs WHERE surveyId=1 AND name='Time' AND val>'2012-06-05 22:14:35');
これには約 200 ミリ秒かかります。これはバグによるものだと思います。それでは、別のことを試してみましょう。
SELECT (@ids:=subId) FROM Inputs WHERE surveyId=1 AND name='Time' AND val>'2012-06-05 22:14:35';
SELECT @ids;
@ids
ここでは、最初のクエリの結果で変数を作成しようとしています。ただし、最後の id のみが変数に格納されます。MySQL 変数は配列では機能しませんか?!
誰でも私を助けることができますか?