我再一次尝试解决一个MYSQL相关的问题,起初听起来很简单,但现在让我有些头疼。我已经阅读了很多片段并进行了几天的实验,但是我在寻找完美解决方案方面没有取得多大成功。
我有两张桌子。第一个包含电话呼叫,每个电话呼叫由第一个表中的一行表示,其中包含以下三列:
p_key(INT),call_date(DATE),call_time(TIME)
我的第二个表包含特定事件,还有三列:
event_id(INT),event_start(DATETIME),event_end(DATETIME)
我想只计算我的第一个表中的条目 - 调用表 - 它们不属于同一日期事件表的开始和结束之间的时间。
我的主要问题是,事件表中可能有多个条目用于单个日期(例如:0800 - 1000的事件和同一天的1400到1600的另一个事件)。否则我可以简单地使用BETWEEN语法。
我想这可能会产生这种影响:
SELECT
SUM(
CASE WHEN t1.p_key != 0
THEN 1 ELSE 0 END
) AS brt,
SUM(
CASE WHEN t1.p_key != 0
AND t1.call_time NOT BETWEEN TIME(t2.event_start) AND TIME(t2.event_end)
THEN 1 ELSE 0 END
) AS net
FROM call_table t1 INNER JOIN event_table t2
ON t1.call_date = DATE(t2.event_start)
WHERE t1.call_date >= '2013-09-01'
AND t1.call_date <= '2013-09-30'
GROUP BY DAY(t1.call_date)
不幸的是,这个查询没有返回任何结果。
有人能指出我的方向吗?
P.S。我试图在SO上找到关于如何格式化我的帖子中的样本表数据的参考,但我要么是盲目的,要么没有具体的参考。由于我已经看到格式良好的示例表数据,我知道它是可能的,所以一个额外的线索也将受到很多赞赏。
更新 我设法得到一些输出,使用LEFT JOIN而不是INNER。由于我不是MySQL专家,如果结果正确,我会去手工计算。
答案 0 :(得分:1)
尝试这样的事情:
SELECT *
FROM call_table t1
WHERE NOT EXISTS (
SELECT * FROM event_table t2
WHERE TIMESTAMP(t1.date, t1.time) BETWEEN t2.event_start AND t2.event_end)
)
这应该为您提供call_table中的所有记录,这些记录不在event_table中的任何事件开始和结束之间。根据需要添加您自己的where-criteria和/或count()函数。
答案 1 :(得分:1)
您应该查询
SELECT
TIMESTAMP(call_date, call_time)
FROM
calls
LEFT JOIN events
ON TIMESTAMP(call_date, call_time)>event_start
AND timestamp(call_date, call_time)<event_end
WHERE
event_start IS NULL
- 见fiddle。
对于计数结果,只需执行
SELECT
COUNT(calls.id)
FROM
calls
LEFT JOIN events
ON TIMESTAMP(call_date, call_time)>event_start
AND timestamp(call_date, call_time)<event_end
WHERE
event_start IS NULL