MySQL 从另一个表连接和 COUNT(*)
Posted
技术标签:
【中文标题】MySQL 从另一个表连接和 COUNT(*)【英文标题】:MySQL joins and COUNT(*) from another table 【发布时间】:2011-06-18 08:09:22 【问题描述】:我有两个表:groups
和 group_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 - 如何使用父表中的值将连接表连接到另一个连接表?
如果存在匹配值,则从另一个表中检索数据 - 否则基于第一个连接条件返回