MySQL 从另一个表连接和 COUNT(*)

Posted

技术标签:

【中文标题】MySQL 从另一个表连接和 COUNT(*)【英文标题】:MySQL joins and COUNT(*) from another table 【发布时间】: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 连接有关。

【问题讨论】:

【参考方案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

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

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

【讨论】:

以上是关于MySQL 从另一个表连接和 COUNT(*)的主要内容,如果未能解决你的问题,请参考以下文章

mysql - 如何使用父表中的值将连接表连接到另一个连接表?

MYSQL UPDATE 查询多个值

如果存在匹配值,则从另一个表中检索数据 - 否则基于第一个连接条件返回

What Joins 用于将多个表连接到一个视图中

Hibernate:如何在注释中将三个 3 表连接到一个连接表中?

MYSQL 为每一行从另一个表连接随机行