我有两个表:groups
和group_members
。
groups
表包含每个组的所有信息,例如其ID,标题,描述等。
在group_members
表格中,它列出了每个小组的所有成员,如下所示:
group_id | user_id
1 | 100
2 | 23
2 | 100
9 | 601
基本上,我想在页面上列出三个组,我只想列出超过四个成员的组。在<?php while ?>
循环中,我想要有四个成员,他们是该组的一部分。我在列出这些组时没有遇到任何问题,并且在另一个内部循环中列出了这些成员,我只是无法优化这些组,因此只有那些有超过4个成员的组才能显示。
有人知道怎么做吗?我确定这是MySQL加入的。
答案 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表以检索名称,从而为您提供最快的结果。