59

我有两张桌子:groupsgroup_members

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

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

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

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

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

4

4 回答 4

108

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

于 2011-01-31T02:21:01.200 回答
60
SELECT DISTINCT groups.id, 
       (SELECT COUNT(*) FROM group_members
        WHERE member_id = groups.id) AS memberCount
FROM groups
于 2014-01-24T05:01:38.280 回答
1

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

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

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

于 2011-01-31T02:45:09.123 回答
0

也许我在这里不合时宜,不理解 OP,但你为什么要加入表格?

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

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

这应该具有最少的开销,因为您正在避免加入,但仍应为您提供所需的内容。

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

于 2017-11-10T10:08:58.913 回答