MySQL从另一个表加入和COUNT(*)

时间:2011-01-31 02:17:25

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

我有两个表:groupsgroup_members

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

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

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

基本上,我想在页面上列出三个组,我只想列出超过四个成员的组。在<?php while ?>循环中,我想要有四个成员,他们是该组的一部分。我在列出这些组时没有遇到任何问题,并且在另一个内部循环中列出了这些成员,我只是无法优化这些组,因此只有那些有超过4个成员的组才能显示。

有人知道怎么做吗?我确定这是MySQL加入的。

4 个答案:

答案 0 :(得分:66)

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中使用的键设置索引,因为它可能会影响您的站点性能。

答案 1 :(得分:36)

SELECT DISTINCT groups.id, 
       (SELECT COUNT(*) FROM group_members
        WHERE member_id = groups.id) AS memberCount
FROM groups

答案 2 :(得分:1)

您的groups_main表格中有一个名为id的关键列。我相信如果USING表具有相同名称的键列,则它只能使用groups_fans语法进行连接,它可能不会。所以,试试这个:

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

或者使用group_id表中适当的列名替换groups_fans

答案 3 :(得分:0)

也许我不在这里,不理解OP,但为什么要加入牌桌呢?

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

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

这应该是最小的开销,因为你正在避免加入,但仍然应该给你你想要的。

如果您需要组详细信息和描述等,请将members表中的联接添加回groups表以检索名称,从而为您提供最快的结果。