我有2个查询:
SELECT m.* FROM (
SELECT type, ROUND(
COUNT(*) / ROUND(
1000 / (SELECT COUNT(*) FROM types)
)
) AS nth FROM data GROUP BY type
) AS m;
和
SELECT d.* FROM (
SELECT * FROM data
WHERE type = @id
AND time BETWEEN @start_date AND @end_date
ORDER BY time ASC
) d
CROSS JOIN (select @i := 0) i
HAVING ( @i := @i + 1) MOD @nth = 1;
第一个查询返回类型" id"和" nth"我希望在秒查询中使用的值对;
我需要一些如何迭代在第二个查询中传递它们的第一个查询值,我该怎么做?
我正在处理的表包含这样的日志
+----+------+---------+---------------------+
| id | type | counter | time |
+----+------+---------+---------------------+
| 1 | 1 | 10001 | 2014-04-06 22:20:21 |
| 2 | 2 | 12354 | 2014-04-06 22:20:21 |
| 3 | 3 | 12456 | 2014-04-06 22:20:21 |
| 4 | 1 | 10101 | 2014-04-06 22:20:21 |
| 5 | 2 | 12454 | 2014-04-06 22:20:21 |
| 6 | 4 | 12679 | 2014-04-06 22:20:21 |
| .. | .. | .. | .. |
+----+------+---------+---------------------+
它包含大量数据,我需要选择数据样本:假设我需要选择+ -1000条记录,例如7种类型,所以我需要为每种类型选择ROUND(1000/7)= 143行。让我们说类型1有1135135条记录,类型2有935135,对于每种类型,我只能选择143条记录,所以如果选择从乞讨到结束(@start_date =最小时间值,@ end_date =最大时间值),我需要从每个类型中以相等的间隔选择143行。例如,类型1是每个ROUND(1135135/143)= 7938记录,列表只包含类型1记录,类型2逻辑将是相同的ROUND(935135/143)= 6539nth
答案 0 :(得分:0)
如果使用子查询无法完成此操作,则不能在不先存储查询的情况下使用另一个查询中的结果。据我所知,有两种方法可以做到这一点:
您可以使用临时表。在第一次查询期间,您必须在临时表中存储id
和nth
值对的值。然后在第二个查询中,通过连接刚刚创建的临时表,再次绘制这些值。
使用局部变量创建存储过程。因此,在您的第一个查询中,您将存储id
和nth
值对select
... into
局部变量。然后在第二个查询中使用这些局部变量。