0
我有一個「輸入」表看起來是這樣的:如何合併2個MySQL查詢?
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
短提交標識。我想在指定時間後通過特定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)。下面是查詢1 EXPLAIN
:
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
當我簡介他們,他們需要約1毫秒一起10,000行。到現在爲止還挺好。不過,我想將它們結合在一起。這是我曾嘗試過的:
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毫秒!我認爲這是由於bug。所以讓我們嘗試別的東西:
SELECT (@ids:=subId) FROM Inputs WHERE surveyId=1 AND name='Time' AND val>'2012-06-05 22:14:35';
SELECT @ids;
在這裏,我試圖讓一個@ids
變量與第一查詢的結果。但是,只有最後一個ID存儲在變量中。 MySQL變量不適用於數組嗎?
任何人都可以幫助我嗎?
'(NOLOCK)'做了什麼? – Joel
這是查詢引擎的命中。它告訴它在運行查詢時不要鎖定表。請參閱http://msdn.microsoft.com/en-us/library/ms187373.aspx。它在生產中用於允許更多查詢同時訪問表。否則引擎一次只允許一個查詢訪問表。 – jneff
好的。 '(NOLOCK)'似乎不適用於我的設置。但是'INNER JOIN'查詢回答了我的問題。謝謝! – Joel