2012-06-07 129 views
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變量不適用於數組嗎?

任何人都可以幫助我嗎?

回答

0

你可以運行它作爲一個查詢:(帶「*」代替第一查詢「子ID」部分,並添加一個「(NOLOCK)」)

SELECT * FROM Inputs (NOLOCK) WHERE surveyId=1 AND name='Time' AND val>'2012-06-05 22:14:35'; 

另一種選擇是使用INNER JOIN:

SELECT Inputs2.* 
FROM Inputs AS Inputs1 (NOLOCK) 
INNER JOIN Inputs AS Inputs2 (NOLOCK) 
ON Inputs1.subId = Inputs2.subId 
WHERE surveyId=1 
AND name='Time' 
AND val>'2012-06-05 22:14:35'; 

我不知道這些選項的時間。

祝你好運!

+0

'(NOLOCK)'做了什麼? – Joel

+0

這是查詢引擎的命中。它告訴它在運行查詢時不要鎖定表。請參閱http://msdn.microsoft.com/en-us/library/ms187373.aspx。它在生產中用於允許更多查詢同時訪問表。否則引擎一次只允許一個查詢訪問表。 – jneff

+0

好的。 '(NOLOCK)'似乎不適用於我的設置。但是'INNER JOIN'查詢回答了我的問題。謝謝! – Joel