【问题标题】:Select rows from Left table that don't appear on right table on join [duplicate]从左表中选择连接时未出现在右表中的行[重复]
【发布时间】:2020-05-07 19:11:01
【问题描述】:

我有一个 mysql 问题,我找不到解决方案。

我有两张桌子:

groups (group_name, group_id)

members (member_id, group_id, user_id)

我想在 members 表中选择与某个 user_id 不匹配的所有组。

这样做的原因是因为我想向用户显示他不属于的所有组。

如果还有一种方法可以显示每个组中的成员数(通过计算成员表中的匹配数),那就太好了。

提前致谢

【问题讨论】:

    标签: mysql sql join group-by count


    【解决方案1】:

    你可以使用not exists:

    select g.*
    from groups g
    where not exists (
        select 1 
        from group_members gm
        where gm.group_id = g.group_id and gm.user_id = ?
    )
    

    问号应替换为您要用作参数的特定用户。

    请注意,这也会带来根本没有成员的组。

    如果您也希望每个组的用户数,那么您可以join 并使用having 子句进行过滤:

    select g.group_id, g.group_name, count(gm.group_id) no_members
    from groups g
    left join group_members gm on gm.group_id = g.group_id
    group by g.group_id, g.group_name
    having count(gm.user_id) = 0 or max(gm.user_id = ?) = 0
    

    或者,如果您想驱逐没有成员的群组:

    select g.group_id, g.group_name, count(*) no_members
    from groups g
    inner join group_members gm on gm.group_id = g.group_id
    group by g.group_id, g.group_name
    having max(gm.user_id = ?) = 0
    

    【讨论】:

    • 非常感谢!
    • 其实第二个查询有问题。它不显示空组。结果最终与最后一个相同,只是显示用户不是其成员且至少有一个成员的组。对于这种特定情况,这不是实际问题,因为我的系统中不会有任何空组,但是如果将来我需要类似的东西,我想学习如何去做。不过还是感谢您的帮助!
    • @Jota:我明白你的意思。我修改了第二个查询。
    猜你喜欢
    • 2016-11-20
    • 2019-05-26
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-21
    • 2014-05-11
    • 2013-10-11
    相关资源
    最近更新 更多