我猜你想要每个不同的日期一行,显示了两个不同的计数值。
这种查询比起初看起来稍微有点诡异,因为这两个摘要查询可能有不同的日期集合。
所以你需要开始一个产生所有可能的利息日期的子查询。然后,您需要将每个摘要查询左连接到它。您必须使用LEFT JOIN而不是普通的内部JOIN,因为当LEFT JOIN不匹配来自左侧的任何行时,LEFT JOIN不会抑制连接右侧的行。
这里有:
所有的日期。请注意0操作是一个精简(重复删除)联合操作。
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
能否请你创建你有什么简单的最小数据视图和你所期望的结果是什么?因为如你所说,这两个查询有1个共同的字段'DATE'和两个不同的字段'newpost'和'subs'。因此,如果将这两个查询结合起来,这是否意味着来自第一个查询的记录将全部具有空的“subs”字段,而来自第二个查询的记录都将具有空的'newpost'字段? – EhsanT