【问题标题】:MySQL joins and COUNT(*) from another tableMySQL 从另一个表连接和 COUNT(*)
【发布时间】:2011-06-18 08:09:22
【问题描述】:

我有两个表:groupsgroup_members

groups 表包含每个组的所有信息,例如其 ID、标题、描述等。

group_members 表中,它列出了属于每个组的所有成员,如下所示:

group_id | user_id
1 | 100
2 | 23
2 | 100
9 | 601

基本上,我想在一个页面上列出三个组,而我只想列出成员超过四个的组。在<?php while ?> 循环中,我想要四个不属于该组的成员。我可以毫无问题地列出组,并在另一个内部循环中列出成员,我只是无法优化组,以便仅显示超过 4 个成员的组。

有人知道怎么做吗?我确定它与 MySQL 连接有关。

【问题讨论】:

    标签: mysql count group-by left-join having


    【解决方案1】:

    MySQL 使用HAVING 语句来执行此任务。

    您的查询将如下所示:

    SELECT g.group_id, COUNT(m.member_id) AS members
    FROM groups AS g
    LEFT JOIN group_members AS m USING(group_id)
    GROUP BY g.group_id
    HAVING members > 4
    

    引用具有不同名称的示例

    SELECT g.id, COUNT(m.member_id) AS members
    FROM groups AS g
    LEFT JOIN group_members AS m ON g.id = m.group_id
    GROUP BY g.id
    HAVING members > 4
    

    此外,请确保您在数据库架构中为您在 JOINS 中使用的键设置索引,因为它会影响您的网站性能。

    【讨论】:

    • 我更改了 SQL 以适合我的代码:SELECT g.id, COUNT(m.id_profile) AS members FROM groups_main AS g LEFT JOIN groups_fans AS m USING(id) GROUP BY g.id HAVING members > 4 导致此 MySQL 错误:“'from 子句'中的未知列 'id'。
    • 只有当两列名称相同时才能使用 USING 语句,在其他情况下使用 ON 语句我会更新我的答案。
    【解决方案2】:
    SELECT DISTINCT groups.id, 
           (SELECT COUNT(*) FROM group_members
            WHERE member_id = groups.id) AS memberCount
    FROM groups
    

    【讨论】:

    • 非常感谢......这帮助我实现了我想要做的事情。
    • 这帮助我解决了我一直在努力解决的问题。谢谢。
    • 感谢分享这个有用的技巧。我帮了我很多。我被用作 set 函数中的 find。
    • 虽然子查询在 mysql 中对性能不友好,但是当性能不是问题时,这是一个快速的好解决方案。
    【解决方案3】:

    您的groups_main 表有一个名为id 的键列。我相信如果groups_fans 表有一个同名的键列,你只能使用USING 语法进行连接,而它可能没有。所以,试试这个:

    LEFT JOIN groups_fans AS m ON m.group_id = g.id

    或将group_id 替换为groups_fans 表中的任何适当列名。

    【讨论】:

      【解决方案4】:

      也许我在这里跑题了,不理解 OP,但你为什么要加入表格?

      如果您有一个包含成员的表,并且该表有一个名为“group_id”的列,您只需对成员表运行查询即可获取按 group_id 分组的成员计数。

      SELECT group_id, COUNT(*) as membercount 
      FROM members 
      GROUP BY group_id 
      HAVING membercount > 4
      

      这应该具有最少的开销,因为您避免了连接,但仍应为您提供所需的内容。

      如果您想要组详细信息和描述等,则将成员表中的连接添加回组表以检索名称会给您最快的结果。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-02-01
        • 2020-06-23
        • 2022-01-07
        • 2018-08-31
        • 2013-10-03
        • 2018-10-05
        • 2017-09-07
        • 1970-01-01
        相关资源
        最近更新 更多