我猜你希望每个不同的日期有一行,显示两个不同的计数值。
这种查询比初看起来要复杂一些,因为这两个摘要查询可能有不同的日期集。
因此,您需要从产生所有可能感兴趣的日期的子查询开始。然后,您需要将每个摘要查询 LEFT JOIN 加入其中。您必须使用 LEFT JOIN 而不是普通的内部 JOIN,因为当连接右侧的行与左侧的任何行都不匹配时,LEFT JOIN 不会抑制来自右侧的行。
这里是:
你所有的日期。请注意UNION 操作是一个集合(重复删除)联合操作。
SELECT DISTINCT DATE(created) DATE FROM newpost
WHERE created >= Last_day(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 1 MONTH
AND created < last_day(CURRENT_DATE) + INTERVAL 1 DAY
UNION
SELECT DISTINCT DATE(TIMESTAMP) DATE FROM trafficstats
WHERE TIMESTAMP >= LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 1 MONTH
AND TIMESTAMP < LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY
然后您需要两个摘要子查询。第一个是这个。请注意,我将COUNT(DISTINCT created) 更改为COUNT(*),因为我不明白DISTINCT 背后的逻辑。一个帖子可以有多行吗?你用时间戳区分它们吗?如果每个帖子都有一行,您应该COUNT(*)。
SELECT DATE(created), COUNT(*) newposts
FROM newpost
GROUP BY DATE(created)
第二个总结是这样的。再次,我数了行数。
SELECT DATE(TIMESTAMP), COUNT(*) subs
FROM trafficstats
GROUP BY DATE(TIMESTAMP)
最后,像这样加入这三个子查询。您从第一个子查询中获取日期,从后两个子查询中获取按日期汇总的信息。
SELECT dates.DATE, posts.newposts, subs.subs
FROM ( /* date subquery */ ) dates
LEFT JOIN ( /* posts subquery */ ) posts ON dates.DATE = posts.DATE
LEFT JOIN ( /* subs subquery */ ) subs ON dates.DATE = subs.DATE
ORDER BY dates.DATE
把它们放在一起:
SELECT dates.DATE, posts.newposts, subs.subs
FROM (
SELECT DISTINCT DATE(created) DATE FROM newpost
WHERE created >= Last_day(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 1 MONTH
AND created < last_day(CURRENT_DATE) + INTERVAL 1 DAY
UNION
SELECT DATE(TIMESTAMP) DATE FROM trafficstats
WHERE TIMESTAMP >= LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 1 MONTH
AND TIMESTAMP < LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY
) dates
LEFT JOIN (
SELECT DATE(created), COUNT(*) newposts
FROM newpost
GROUP BY DATE(created)
) posts ON dates.DATE = posts.DATE
LEFT JOIN (
SELECT DATE(TIMESTAMP), COUNT(*) subs
FROM trafficstats
GROUP BY DATE(TIMESTAMP)
) subs ON dates.DATE = subs.DATE
ORDER BY dates.DATE