我猜你想要每個不同的日期一行,顯示了兩個不同的計數值。
這種查詢比起初看起來稍微有點詭異,因爲這兩個摘要查詢可能有不同的日期集合。
所以你需要開始一個產生所有可能的利息日期的子查詢。然後,您需要將每個摘要查詢左連接到它。您必須使用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