mysql - 使用 mysql GROUP_CONCAT 和 WHERE

标签 mysql group-concat

我的数据库中有以下表格

事件

ID, TITLE, ...

投票数

ID, TYPE, ID_EVENT

评论

ID, COMMENT, ID_EVENT

日期

ID, DATE, ID_EVENT

一个 EVENT 有很多 Action ,有很多评论并且有很多日期

我使用以下查询从 EVENTS 表中检索信息,并为每个事件检索投票数、评论数和每个日期。对于其中一个日期 = 明天 (2015-04-03) 的事件

        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。

怎么了?

最佳答案

您想要明天有一个日期的事件。您的查询会这样做,但它也会切断所有其他日期。

您需要一个额外的连接或一个 EXISTS 子查询。

您还需要 GROUP_CONCAT() 上的 DISTINCT,就像您在 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。在您的情况下,一个小缺点是连接到 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
      ) ;

关于mysql - 使用 mysql GROUP_CONCAT 和 WHERE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29421431/

相关文章:

mysql - 基于第一个表合并多个表的数据

mysql - 在 MySQL 中加入具有相似值的行

php - codeigniter 加入多对多 LIMIT

使用 GROUP_CONCAT 连接中的 MySql 重复值

mysql - 让 MySQL 5.7 显示毫秒,而不是微秒

php - 使用 MySQL 事件查询

mysql - IF ELSE 不适用于 SQL/MySQL

javascript - 使用 JavaScript/Ajax 优化搜索结果

mysql - 如何将子查询中的字符串连接到mysql中的一行?

php - 在 mysql 中选择 GROUP_CONCAT