我有一个“输入”表,看起来像这样:
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变量不适用于数组吗?!
任何人都可以帮助我吗?
答案 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';
我不知道这些选项的时间安排。
祝你好运!