MySQL按日期统计另一表记录数:现有查询扩展求助
嘿,我太懂这种熬大半天写查询却卡壳的滋味了,简直让人头大!别着急,咱们来一步步解决这个问题——你要做的就是把现有统计和另一张表的每日记录数结合起来对吧?
首先,我先把你的需求拆解一下:你的现有查询是按用户分组、日期、问题ID/内容统计不同评分(NULL/Poor/Good等)的数量,现在要额外加上另一张表按相同日期统计的总记录数。
核心思路是把你的现有查询做成一个独立的统计模块,再和另一张表的每日统计结果通过日期关联起来。这里用CTE(公共表表达式)会让逻辑更清晰,避免嵌套子查询的混乱。
假设你的另一张表叫OtherTable,里面有一个时间字段比如RecordTime(你可以替换成实际字段名),下面是完整的示例代码:
WITH OriginalSurveyStats AS ( -- 这里是你原有的查询,我帮你补全了基本结构,记得替换实际表名和关联条件 SELECT B.Usr_Sb_Grp, DATE(CONVERT_TZ(A.TimeStamp,'UTC','America/Chicago')) AS Day, B.ID, B.Qstn, SUM(IF(A.AnswerID = '0', 1, 0)) AS 'NULL', SUM(IF(A.AnswerID = '1', 1, 0)) AS 'Poor', SUM(IF(A.AnswerID = '2', 1, 0)) AS 'Good' -- 把你原来没写完的其他AnswerID统计补在这里 FROM -- 替换成你实际的表A和表B的名字,还有它们的关联条件(比如A的问题ID对应B的ID) YourTableA A INNER JOIN YourTableB B ON A.Qstn_ID = B.ID -- 如果原查询有WHERE过滤条件,加在这里 -- WHERE A.SomeCondition = 'xxx' GROUP BY B.Usr_Sb_Grp, Day, B.ID, B.Qstn ), OtherTableDailyCounts AS ( -- 另一张表的每日记录数统计,时区转换要和上面完全一致! SELECT DATE(CONVERT_TZ(RecordTime,'UTC','America/Chicago')) AS Day, COUNT(*) AS DailyRecordCount FROM YourOtherTable -- 如果另一表需要过滤条件,加在这里 -- WHERE RecordStatus = 'Valid' GROUP BY Day ) -- 把两个统计结果关联起来 SELECT oss.*, -- 用COALESCE确保如果某天另一表没记录,显示0而不是NULL COALESCE(otdc.DailyRecordCount, 0) AS OtherTableDailyRecords FROM OriginalSurveyStats oss -- 用LEFT JOIN保证原统计的所有日期都能显示,哪怕另一表当天没数据 LEFT JOIN OtherTableDailyCounts otdc ON oss.Day = otdc.Day ORDER BY oss.Day, oss.Usr_Sb_Grp, oss.ID;
这里有几个关键细节一定要注意:
- 时区转换必须完全一致:两张表的
Day字段都要用CONVERT_TZ转成芝加哥时间的日期,否则会出现日期不匹配的情况(比如一个是UTC日期,一个是芝加哥日期,关联不上) - JOIN类型选择:如果希望原查询的所有记录都保留,哪怕另一表当天没有记录,就用
LEFT JOIN;如果只需要显示两表都有数据的日期,换成INNER JOIN - COALESCE的作用:当另一表某天没有记录时,
LEFT JOIN会返回NULL,用COALESCE把它转换成0,统计结果更合理 - 替换实际名称:记得把代码里的
YourTableA、YourTableB、YourOtherTable换成你数据库里的真实表名,还有关联条件(比如A.Qstn_ID = B.ID)也要改成你实际的关联逻辑
如果你的需求是按用户分组+日期统计另一表的记录数(而不是单纯的全局每日数),那只需要修改OtherTableDailyCounts的GROUP BY,加上Usr_Sb_Grp,同时JOIN条件也要匹配这个字段,比如:
OtherTableDailyCounts AS ( SELECT Usr_Sb_Grp, -- 假设另一表也有这个分组字段 DATE(CONVERT_TZ(RecordTime,'UTC','America/Chicago')) AS Day, COUNT(*) AS DailyRecordCount FROM YourOtherTable GROUP BY Usr_Sb_Grp, Day ) -- 然后JOIN条件改成: LEFT JOIN OtherTableDailyCounts otdc ON oss.Day = otdc.Day AND oss.Usr_Sb_Grp = otdc.Usr_Sb_Grp
这样就能实现每个用户分组每天的记录数统计了。
内容的提问来源于stack exchange,提问作者Emerge2001
相关产品推荐
相关产品推荐

