0

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

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在指定时间后获得所有特定的提交。有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 变量不能与数组一起使用吗?!

谁能帮我?

4

1 回答 1

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';

我不知道这些选项的时机。

祝你好运!

于 2012-06-07T15:48:55.123 回答