2015-04-02 219 views
1

我在DB下表下使用mysql GROUP_CONCAT和WHERE

EVENT

ID, TITLE, ... 

票數

ID, TYPE, ID_EVENT 

評論

ID, COMMENT, ID_EVENT 

DATES

ID, DATE, ID_EVENT 

一個事件有許多動作,有許多意見和有許多日期

我使用以下查詢從EVENTS表中檢索信息,併爲每個事件檢索投票數,評論數和每個日期。對於他們的最新的一個事件=明日(2015年4月3日)

 SELECT events.id, 
       events.title, 
       GROUP_CONCAT(dates.date) AS dates, 
       COUNT(distinct votes.id) AS votes, 
       COUNT(distinct comments.id) AS comments 
     FROM events 
     LEFT JOIN dates on dates.post_id = events.id 
     LEFT JOIN votes on votes.post_id = events.id AND votes.type = 1 
     LEFT JOIN comments on comments.votes_id = votes.id 
     WHERE dates.date = CURDATE() + INTERVAL 1 DAY 
     GROUP BY events.id 

結果看起來像這樣

id title dates       votes comment 
33 Event33 2015-04-03,2015-04-03,2015-04-03 4  0 
39 Event39 2015-04-03      9  1 

爲什麼日期欄重複同日(明天)??? Event33的日期應爲2015-04-01,2015-04-02,2015-04-03。

出了什麼問題?

+0

你可能想'GROUP BY events.id'和使用'裏面distinct'的' GROUP_CONCAT()',正如你對'COUNT()' – 2015-04-02 20:02:50

+0

所做的那樣,對不起ypercube,這個小組寫的是一個錯誤。我編輯它。查詢工作正常,沒有列出所有事件的WHERE子句。但是,當我添加where子句來按日期過濾 – user3670128 2015-04-02 20:50:31

回答

0

您希望明天的活動有一個。你的查詢做到了,但它也切斷了所有其他日期。

您需要額外的加入或EXISTS子查詢。

您還需要一個DISTINCTGROUP_CONCAT(),你用它在COUNT()總以同樣的方式:

SELECT events.id, 
     events.title, 
     GROUP_CONCAT(DISTINCT dates.date) AS dates, 
     COUNT(DISTINCT votes.id) AS votes, 
     COUNT(DISTINCT comments.id) AS comments 
FROM events 
    LEFT JOIN dates ON dates.post_id = events.id 
    LEFT JOIN votes ON votes.post_id = events.id AND votes.type = 1 
    LEFT JOIN comments ON comments.votes_id = votes.id 
WHERE EXISTS 
     (SELECT 1 
     FROM dates AS dd 
     WHERE dd.date = CURDATE() + INTERVAL 1 DAY 
      AND dd.post_id = events.id 
    ) 
GROUP BY events.id ; 

另一種方法是使用內聯子查詢。在此不需要GROUP BYDISTINCT。你的情況A小調缺點,就是加盟comments是通過votes,所以一個子查詢有一個額外的加入:

SELECT e.id, 
     e.title, 
     (SELECT GROUP_CONCAT(d.date) 
      FROM dates AS d 
      WHERE d.post_id = e.id 
     ) AS dates, 
     (SELECT COUNT(v.id) 
      FROM votes AS v 
      WHERE v.post_id = e.id AND v.type = 1 
     ) AS votes, 
     (SELECT COUNT(c.id) 
      FROM comments AS c 
      JOIN votes AS v ON c.votes_id = v.id 
      WHERE v.post_id = e.id AND v.type = 1 
     ) AS comments 
FROM events AS e 
WHERE EXISTS 
     (SELECT 1 
     FROM dates AS dd 
     WHERE dd.date = CURDATE() + INTERVAL 1 DAY 
      AND dd.post_id = events.id 
    ) ; 
+0

時,它不起作用。它適用於我!謝謝ypercube – user3670128 2015-04-02 22:32:02