2012-01-31 58 views
0

我试图做一个查询,该查询需要从一行创建时间戳,然后根据第一个时间戳在INTERVAL中基于'修改'时间戳计算唯一用户的数量。我得到了一个输出,但这不是我所期望的。引用其他行的MySQL查询

我有一种感觉,我试图做的事是不可能的,或者是因为GROUP BY或DATE_SUB。这是什么,我有一个骨架:

SELECT jobid, ctime, date, foo.count 

FROM Table foo 

JOIN (
    SELECT 
     COUNT(DISTINCT user) AS count 

    FROM Table 

    WHERE mtime >= DATE_SUB(ctime, INTERVAL 12 HOUR) 

    GROUP BY window 
) bar ON foo.id = bar.id 

ORDER BY ctime 

这个查询的目的是为了让来找工作的,我可以看一下时间作业A创建,并计算有多少用户(工人)是活跃的在过去的12个小时内,根据有多少人在那段时间内“修改”了其他工作。

因此,基本上,像这样的表:

jobid userid ctime mtime  date 
1  Alan  9:00 AM 11:00 AM 1st 
2  Bob  10:00 AM 1:00 PM 1st 
3  Carla  1:00 PM 11:00 PM 2nd 
4  Dave  9:00 AM 10:00 AM 3rd 
5  Emma  11:00 AM 1:00 PM 3rd 

我所需的输出会是这样:

jobid ctime  date foo.count 
2  10:00 AM 1st  1 
3  1:00 PM 2nd  0 
4  9:00 AM 3rd  1 
5  10:00 AM 3rd  2 

我在正确的轨道上我的查询吗?或者我是否通勤?

编辑:

SELECT 
    ci.ctime AS "Job Creation Time", 
    ci.job_id AS "Job ID", 
    ci.pickup_time AS "Pickup Time", 
    HOUR(wt.ctime) AS "Active Window", 
    xx.Active AS "#Active in Window" 

FROM worker_to AS wt 
JOIN stats_ci_data ci ON ci.job_id = wt.id 
JOIN `order` o ON o.id = wt.order_id 

JOIN (
    SELECT 
     wt.id AS `id`, wt.ctime, 
     DATE(wt.ctime) AS `date`, 
     DATE_FORMAT(wt.ctime, '%m-%d-%H') AS win, 
     COUNT(DISTINCT wt.worker_id) AS "Active" 

     FROM worker_to wt 
     JOIN `order` o ON o.id = wt.order_id 

     WHERE wt.mtime BETWEEN DATE_SUB(wt.ctime, INTERVAL 12 HOUR) AND wt.ctime 
     AND wt.tier != "machine" 
     AND wt.preferred_worker_flag != '1' 
     AND o.source LIKE '%Mozilla%' 
     OR o.source LIKE 'Opera%' 
     OR o.source LIKE 'Firefox%' 

     GROUP BY win 
    ) xx ON xx.id = wt.id 

WHERE wt.tier != "machine" 
AND wt.preferred_worker_flag != "1" 
AND o.source LIKE '%Mozilla%' 
OR o.source LIKE 'Opera%' 
OR o.source LIKE 'Firefox%' 

ORDER BY ci.ctime, HOUR(wt.mtime) 
; 

所以,我用加入的,而不是来自同一个表两次拉,因为我需要把一堆“过滤器”,像层,preferred_worker,源。我认为这会减慢查询速度。但同时,我觉得时间间隔也不能给我正确的数字。目前,子查询组通过DATE窗口,但活跃工人的数量是每天1,2,3,这似乎真的很低。

回答

0

不太确定我是否完全理解你的问题,但我确实相信你想要这样的东西。请问ctimemtime是否包含日期和时间?如果不是,则需要在下面的SQL中将它们替换为既有日期又有时间的表达式。但这至少应该让你开始。

select this.jobid, this.ctime, this.date, count(*) 
from Table this, Table other 
where other.mtime between (this.ctime - interval 12 hours) and this.ctime 
    and this.userid != other.userid 
group by this.jobid, this.ctime, this.date 
+0

嘿大卫,谢谢你的回复。是的,'ctime'和'mtime'都有日期和时间。我不认为'和this.userid!= ...'是我正在寻找的,但是我正在尝试'BETWEEN'运算符。它似乎并没有改变我得到的数字。我想我会在明天发布完整查询,希望能够更好地传达我正在努力实现的目标。 – Murmur 2012-02-01 15:24:23