【问题标题】:SQL aggregate functions value multiplicationSQL聚合函数值乘法
【发布时间】:2015-10-29 00:19:38
【问题描述】:

在单个查询中,我想在来自两个不同表的两个不同列上 COUNTGROUP_CONCAT

问题是COUNT 返回的数字乘以GROUP_CONCAT 中不同项目的数量,在GROUP_CONCAT 结果中,每个不同项目都乘以 COUNT 应该返回的数字。

这是查询:

SELECT e.id, GROUP_CONCAT(c.id SEPARATOR ',') AS category_ids, COUNT(a.id) AS numberAttenders, e.event_capacity
FROM events e
LEFT JOIN attendees a ON a.event_id=e.id,
categories c,
event_categories ec
WHERE  e.id=ec.event_id 
AND ec.category_id=c.id 
GROUP BY e.id
HAVING numberAttenders < e.event_capacity OR e.event_capacity=0

这是一个SQL Fiddle,所以这更清楚/可测试。

结果看起来像这样:

id 1
category_ids 1,2,1,2
numberAttenders 4
event_capacity 10

当我想要这样的东西时:

id 1
category_ids 1,2
numberAttenders 2
event_capacity 10

我用GROUP BY玩了一点,但还没有成功。

【问题讨论】:

  • 非常感谢提供工作示例,但我强烈建议您将查询(尽最大努力)添加到问题本身。
  • 我添加了查询,谢谢您的评论

标签: mysql sql group-by aggregate multiplication


【解决方案1】:

您将获得每个活动的参与者和类别的笛卡尔积。最好的解决方案是在进行连接之前聚合表:

SELECT e.id, ec.category_ids, a.NumAttendees, e.event_capacity
FROM events e LEFT JOIN
     (SELECT a.event_id, COUNT(*) as NumAttendees
      FROM attendees a
      GROUP BY a.event_id
     ) a
     ON a.event_id = e.id LEFT JOIN
     (SELECT ec.event_id, GROUP_CONCAT(c.id SEPARATOR ',') as category_ids
      FROM event_categories ec JOIN
           categories c
           ON ec.category_id = c.id 
      GROUP BY ec.event_id
     ) ec
     ON  e.id=ec.event_id 
HAVING NumAttendees < e.event_capacity OR e.event_capacity = 0;

Here 是一个 SQL Fiddle。

【讨论】:

  • 感谢您的回答,它正在做我想做的事。我以前从未想过这个解决方案,所以你今天给我上了很好的一课。
猜你喜欢
  • 2011-07-10
  • 1970-01-01
  • 2011-07-21
  • 1970-01-01
  • 2020-05-09
  • 2013-08-14
相关资源
最近更新 更多