如何组合2个MySQL查询?

时间:2012-06-07 15:28:10

标签: mysql query-optimization

我有一个“输入”表,看起来像这样:

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是提交ID的缩写。我希望在指定时间后获得具有特定survId的所有提交。有两个步骤。首先,在特定时间后获取所有提交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

当我对它们进行分析时,它们在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毫秒!我认为这是由于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变量不适用于数组吗?!

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

您可以将其作为一个查询运行:(将第一个查询'subId'部分替换为'*'并添加'(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';

我不知道这些选项的时间安排。

祝你好运!