MySQL在工作日连接表+;时间戳的小时数,每个表的计数
我有两张结构完全相同的桌子。它们包含年度活动入口处填写的表格中的数据。这些表中的一个字段是带有条目日期和时间的MySQL在工作日连接表+;时间戳的小时数,每个表的计数,mysql,datetime,join,count,timestamp,Mysql,Datetime,Join,Count,Timestamp,我有两张结构完全相同的桌子。它们包含年度活动入口处填写的表格中的数据。这些表中的一个字段是带有条目日期和时间的DATETIME 出于统计目的,我试图比较每年每小时的参赛人数。当然,我可以为每个表运行单独的查询,并将它们放在PHP中。但我认为在一次查询中也应该可以实现。但是,我不知道如何建立正确的查询 到目前为止,我得到的是: SELECT WEEKDAY(P3.AddedOn) Day, HOUR(P3.AddedOn) Hour, COUNT(P3.AddedOn) E
DATETIME
出于统计目的,我试图比较每年每小时的参赛人数。当然,我可以为每个表运行单独的查询,并将它们放在PHP中。但我认为在一次查询中也应该可以实现。但是,我不知道如何建立正确的查询
到目前为止,我得到的是:
SELECT
WEEKDAY(P3.AddedOn) Day,
HOUR(P3.AddedOn) Hour,
COUNT(P3.AddedOn) Entries2013,
COUNT(P2.AddedOn) Entries2012
FROM Event2013 P3
LEFT JOIN Event2012 P2
ON WEEKDAY(P3.AddedOn) = WEEKDAY(P2.AddedOn)
AND HOUR(P3.AddedOn) = HOUR(P2.AddedOn)
GROUP BY WEEKDAY(P3.AddedOn), WEEKDAY(P2.AddedOn), HOUR(P3.AddedOn), HOUR(P2.AddedOn)
但是这个查询会产生一些奇怪的结果,其中的Entries2012和Entries2013列中的数字都太大了。它增加了一些数据,但我不能准确地计算出是哪个
我做错了什么
谢谢你的帮助
--
使用子查询解决:
SELECT
P2.Day,
P2.Hour,
P2.Entries Entries2012,
P3.Entries Entries2013
FROM
(
SELECT
WEEKDAY(AddedOn) Day,
HOUR(AddedOn) Hour,
COUNT(1) AS Entries
FROM Event2012
GROUP BY Day, Hour
) P2
LEFT JOIN
(
SELECT
WEEKDAY(AddedOn) Day,
HOUR(AddedOn) Hour,
COUNT(1) AS Entries
FROM Event2013
GROUP BY Day, Hour
) P3
ON P2.Day = P3.Day
AND P2.Hour = P3.Hour
--
现在还有一些MySQL完全外部连接:
SELECT
Day,
Hour,
Entries2012,
Entries2013
FROM (
SELECT
(CASE P2.Day
WHEN 4 THEN "Fr"
WHEN 5 THEN "Sat"
WHEN 6 THEN "Sun"
ELSE P2.Day
END) AS Day,
P2.Hour,
COALESCE(P2.Entries, 0) Entries2012,
COALESCE(P3.Entries, 0) Entries2013
FROM (
SELECT
WEEKDAY(AddedOn) Day,
HOUR(AddedOn) Hour,
COUNT(1) AS Entries
FROM Event2012
GROUP BY Day, Hour) P2
LEFT JOIN (
SELECT
WEEKDAY(AddedOn) Day,
HOUR(AddedOn) Hour,
COUNT(1) AS Entries
FROM Event2013
GROUP BY Day, Hour) P3
ON P2.Day = P3.Day
AND P2.Hour = P3.Hour
UNION SELECT
(CASE P3.Day
WHEN 4 THEN "Fr"
WHEN 5 THEN "Sat"
WHEN 6 THEN "Sun"
ELSE P3.Day
END) AS Day,
P3.Hour,
COALESCE(P2.Entries, 0) Entries2012,
COALESCE(P3.Entries, 0) Entries2013
FROM (
SELECT
WEEKDAY(AddedOn) Day,
HOUR(AddedOn) Hour,
COUNT(1) AS Entries
FROM Event2012
GROUP BY Day, Hour) P2
RIGHT JOIN (
SELECT
WEEKDAY(AddedOn) Day,
HOUR(AddedOn) Hour,
COUNT(1) AS Entries
FROM Event2013
GROUP BY Day, Hour) P3
ON P2.Day = P3.Day
AND P2.Hour = P3.Hour
WHERE P2.Hour IS NULL) AS tmp
ORDER BY Day, Hour
LEFT JOIN表示您打算从P3获取所有条目,并期望其中一些条目在P2中不匹配。如果P3是您的基表(并且您在另一个表中查找可能的匹配项),则只需按P3列进行分组
SELECT P3.Day Day, P3.Hour Hour, Entries2013, Entries2012
FROM (
SELECT
WEEKDAY(AddedOn) Day,
HOUR(AddedOn) Hour,
COUNT(AddedOn) Entries2013
GROUP BY Day, Hour
FROM Event2013) P3
LEFT JOIN (
SELECT
WEEKDAY(AddedOn) Day,
HOUR(AddedOn) Hour,
COUNT(AddedOn) Entries2012
GROUP BY Day, Hour
FROM Event2012) P2
ON P3.DAY = P2.DAY
AND P3.Hour = P2.Hour
GROUP BY P3.Day, P3.Hour;
此外,使用WEEKDAY意味着对给定年份的所有周一、周二等进行汇总,然后从中获得每小时的汇总。如果您想获取每日摘要(其中日期为一年中的某一天),则应使用DAYOFYEAR i/o WEEKDAY。查看工会声明:
这将合并来自两个表的查询。我稍后在
分组中添加了额外的列。不幸的是,省略它们不会改变结果。按工作日进行分组是有意的(但可能是错误的?)。该活动每年在周六和周日举行一次。我正在寻找的结果应该允许我比较这两个年份上午9点和上午10点之间(例如周六)的参赛数量。