【问题标题】:getting data from 2 tables - once with count, once without从 2 个表中获取数据 - 一次有计数,一次没有
【发布时间】:2019-10-31 19:48:01
【问题描述】:

我有一组桌子

标识 |组名

然后是用户(这里不重要)

标识 |用户名

然后映射map-group-user

标识 |组 ID |用户ID

第一步我想知道每个组中有多少用户......

SELECT             
g.groupName as name,  count(DISTINCT m.groupId, m.userId) as totalCount             
FROM group g             
LEFT JOIN map-group-user m ON ( g.id = m.groupId)              
GROUP BY g.id             

这行得通...我的结果是:

名称 |总数

组1 | 34

组2 | 23

组3 | 11

现在我想在相同的结果中添加另一列 ...知道我的用户属于哪些组) 所以在同一个查询中,我想检查在 map-group-user 中是否有我的 userId (1) 的每个组的条目

所以我想要这样的结果:

名称 |总数 |我的用户

组1 | 34 | 1

组2 | 23 | 0

组3 | 11 | 1

所以 myUser = 1 他已经在组中...

我希望我的解释清楚:)

感谢您的帮助

【问题讨论】:

    标签: mysql sql left-join


    【解决方案1】:

    将此作为一列添加到您的选择中:

    CASE
        WHEN m.userId = 541 THEN 1
        ELSE 0
    END as myUser
    

    在我的示例中,您的用户 ID 是 541。所以像这样:

    SELECT g.groupName as name
           , count(DISTINCT m.groupId, m.userId) as totalCount             
           , sum(CASE
                WHEN m.userId = 541 THEN 1
                ELSE 0
             END) as myUser
    FROM `group` as g             
    LEFT JOIN `map-group-user` as m ON (g.id = m.groupId)              
    GROUP BY g.groupName   
    

    这里是DEMO

    【讨论】:

    • DISTINCT 可以简化为DISTINCT m.userId
    • 我正在查看表名“组”。会不会有什么问题?
    • 可能是的。也许应该用反引号括起来。
    • 哇。感谢您的快速回答。我认为这就是我所需要的,尽管某处可能需要小修复...我收到 SQL 语法错误...我正在准备小提琴来可视化它...
    • @VBokšić 非常乐意这样做。我会投票,但我的评分太低 :( 再次感谢!
    【解决方案2】:

    您的distinct 似乎没有必要。据推测,group-members 表没有重复项。有了这个观察,我建议:

    SELECT g.groupName as name, count(*) as totalCount,
           sum( gu.user_id = 541 ) as myUser             
    FROM group g LEFT JOIN
         map_group_user gu
         ON g.id = gu.groupId             
    GROUP BY g.id; 
    

    【讨论】:

    • @MichaelZet 。 . .这是一个更简单、更快的解决方案,这就是我建议它的原因。
    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    相关资源
    最近更新 更多