2016-11-24 31 views
3

這似乎是一件容易的事情,但我的基本sql知識讓我失望,因爲我還在學習。將按日期分組的兩條select語句組合起來,返回兩列數據

基本上,我想結合:

SELECT DATE(created) DATE, COUNT(DISTINCT created) newpost FROM surveys 
WHERE created >= Last_day(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 1 MONTH 
AND created < last_day(CURRENT_DATE) + INTERVAL 1 DAY GROUP BY DATE(created); 

SELECT DATE(TIMESTAMP) DATE,subs FROM trafficstats 
WHERE TIMESTAMP >= LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 1 MONTH 
AND TIMESTAMP < LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY; 

成一個查詢,將返回數據,按日期分組,分爲兩個附加列 - newpostssubs

我試過用UNION,這似乎沒有給我我想要的輸出。它將數據合併成一列(newpost),也沒有按日期分組。

我還是相當新的寫MySQL查詢,我試過尋找答案無濟於事。希望能在這裏找到比我更聰明的人的知識。

+0

能否請你創建你有什麼簡單的最小數據視圖和你所期望的結果是什麼?因爲如你所說,這兩個查詢有1個共同的字段'DATE'和兩個不同的字段'newpost'和'subs'。因此,如果將這兩個查詢結合起來,這是否意味着來自第一個查詢的記錄將全部具有空的「subs」字段,而來自第二個查詢的記錄都將具有空的'newpost'字段? – EhsanT

回答

1

你可以使用JOIN

select t1.DATE, t1.newpost, t2.subs 
    from (
     SELECT DATE(created) DATE, COUNT(DISTINCT created) newpost 
     FROM surveys 
     WHERE created >= Last_day(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 1 MONTH 
     AND created < last_day(CURRENT_DATE) + INTERVAL 1 DAY 
     GROUP BY DATE(created) 
    ) t1 
    left join (
     SELECT DATE(TIMESTAMP) DATE, subs 
     FROM trafficstats 
     WHERE TIMESTAMP >= LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY - INTERVAL 1 MONTH 
     AND TIMESTAMP < LAST_DAY(CURRENT_DATE) + INTERVAL 1 DAY 
    ) t2 on t1.DATE = t2.DATE 
+0

這適用於我的需求。 –

1

我猜你想要每個不同的日期一行,顯示了兩個不同的計數值。

這種查詢比起初看起來稍微有點詭異,因爲這兩個摘要查詢可能有不同的日期集合。

所以你需要開始一個產生所有可能的利息日期的子查詢。然後,您需要將每個摘要查詢左連接到它。您必須使用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 
+0

我需要的結果是按日期分組的一行,新帖子數量的列和子數量的列。好消息是兩個表之間的所有日期都匹配,所以它不應該由於空值而丟失任何數據。 –