我试图做一个查询,该查询需要从一行创建时间戳,然后根据第一个时间戳在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,这似乎真的很低。
嘿大卫,谢谢你的回复。是的,'ctime'和'mtime'都有日期和时间。我不认为'和this.userid!= ...'是我正在寻找的,但是我正在尝试'BETWEEN'运算符。它似乎并没有改变我得到的数字。我想我会在明天发布完整查询,希望能够更好地传达我正在努力实现的目标。 – Murmur 2012-02-01 15:24:23