MySQL GROUP BY ...具有不同的值相同的字段

Posted

技术标签:

【中文标题】MySQL GROUP BY ...具有不同的值相同的字段【英文标题】:MySQL GROUP BY...HAVING different values same field 【发布时间】:2016-02-12 09:22:02 【问题描述】:

我想使用类似于以下的查询来检索events 中至少有一个对应'male''female'event_attendances 行的所有行。以下查询不返回任何行(其中肯定有一些events 具有来自两种性别的event_attendances)。

有没有办法在没有子查询的情况下做到这一点(由于我的应用程序中生成 SQL 的方式,子查询对我来说实施起来要困难得多)?

SELECT * FROM events e
LEFT JOIN event_attendances ea ON (e.id = ea.event_id)
GROUP BY e.id
HAVING ea.gender = 'female' AND ea.gender = 'male'

【问题讨论】:

请给出 event_attendances 的结构 【参考方案1】:

使用

HAVING sum(ea.gender = 'female') > 0 
   AND sum(ea.gender = 'male') > 0

HAVING count(distinct ea.gender) = 2

顺便说一句,您应该在分组时使用子查询来获取所有数据。

SELECT * 
FROM events
where id in
(
    SELECT events.id 
    FROM events
    LEFT JOIN event_attendances ON (events.id = event_attendances.event_id)
    GROUP BY events.id
    HAVING count(distinct event_attendances.gender) = 2
)

【讨论】:

您可能会提到一个失败的假设,即 group by 将为单个字段显示多个值。 @SamuelÅslund 实际上我并没有假设 - 我对相关 event_attendances 记录中的数据不感兴趣。 @Will:他的意思是 mysql 有一个糟糕的特性,允许选择不分组或聚合的列。不要这样做。使用我展示的子查询。 @juergend 谢谢,这个解决方案效果很好。不确定我是否完全理解为什么这里需要子查询,您给出的示例和我的查询有什么区别(修改为使用SUM(ea.gender... @Will:尝试了解分组的工作原理。你不看一个单一的记录。您建立一个组并查看多条记录。然后根据您的定义选择构建组的列。其他列需要汇总,例如求和或计数等。如果您不这样做,则数据库不知道如何选择记录。任何其他数据库引擎都会引发错误。但 MySQL 允许这样做。【参考方案2】:

HAVING 通常与聚合函数一起使用。

你应该做self-join来得到想要的结果,因为ea.gender = 'female' AND ea.gender = 'male'是矛盾的,它总是返回空集。

你可以试试这个

SELECT T1.* 
FROM events T1 
INNER JOIN 
(SELECT events.id 
    FROM events
    LEFT JOIN event_attendances ON (events.id = event_attendances.event_id)
    GROUP BY events.id
    HAVING COUNT(DISTINCT event_attendances.gender) = 2) T2 ON T1.events.id=T1.events.id

希望这会有所帮助。

【讨论】:

以上是关于MySQL GROUP BY ...具有不同的值相同的字段的主要内容,如果未能解决你的问题,请参考以下文章

如何从具有重复项的 GROUP BY 中求和不同的值

Mysql group by 具有不同的和内部连接

使用 Group By 时如何区分记录?

sum()在具有多个联接的MySQL查询中不能正常工作(group by不能按预期工作)

mysql统计一列中有多少不同的值

MYSQL SELECT 与 GROUP。想要限制 GROUP BY 中返回元素的数量