【问题标题】:MySQL Query for group participant COUNT and IF isParticipant statementMySQL 查询组参与者 COUNT 和 IF isParticipant 语句
【发布时间】:2026-01-04 04:35:01
【问题描述】:

我的 MySQL 查询有问题,我无法解决。

初始情况如下: 我有一个包含用户的表和一个包含组的表。两个表都由一个多通(group_participant)表连接。

以下查询有效:

SELECT 
    id, 
    COUNT(participant.groupId) AS participantsCount
FROM 
    group 
LEFT JOIN 
    group_participant participant 
ON 
    participant.groupId = id
GROUP BY
    id

现在我想用一个过滤器扩展这个查询,该过滤器只返回我作为参与者的条目,但参与者的计数不应该受到影响。

之后,如果用户是否是参与者,应该可以在 Select 中指定一个标志

应该是这样的:

SELECT 
    id, 
    COUNT(participant.groupId) AS participantsCount, 
    IF(participant.userId = "87b67168-0d7d-46c5-9437-29f996b3d85d", 1, 0) AS isParticipant
FROM 
    group 
LEFT JOIN 
    group_participant participant
ON 
    participant.groupId = id
WHERE 
    participant.userId = "87b67168-0d7d-46c5-9437-29f996b3d85d" 
GROUP BY
    id

我该如何解决这个问题?

【问题讨论】:

  • 哦,我忘了说:MySQL

标签: mysql sql if-statement count left-join


【解决方案1】:

如果您只想要您参与的组,请删除WHERE 子句并在HAVING 子句中设置条件:

SELECT 
    g.id, 
    COUNT(gp.userId) AS participantsCount
FROM group g LEFT JOIN group_participant participant gp
ON gp.groupId = g.id
GROUP BY g.id
HAVING MAX(CASE WHEN gp.userId = '87b67168-0d7d-46c5-9437-29f996b3d85d' THEN 1 ELSE 0 END) = 1 

在像 MySql 这样的数据库中,您可以像这样编写HAVING 子句:

HAVING MAX(gp.userId = '87b67168-0d7d-46c5-9437-29f996b3d85d') = 1  

设置标志:

SELECT 
    g.id, 
    COUNT(gp.userId) AS participantsCount,
    MAX(CASE WHEN participant.userId = '87b67168-0d7d-46c5-9437-29f996b3d85d' THEN 1 ELSE 0 END) AS isParticipant
FROM group g LEFT JOIN group_participant participant gp
ON gp.groupId = g.id
GROUP BY g.id

或者对于 MySql:

MAX(participant.userId = '87b67168-0d7d-46c5-9437-29f996b3d85d') AS isParticipant

【讨论】:

  • 谢谢@forpas!它解决了这个问题。祝你有美好的一天。