web-dev-qa-db-ja.com

MySQLは別のテーブルからCOUNT(*)を結合します

2つのテーブルがあります:groupsgroup_members

groupsテーブルには、ID、タイトル、説明など、各グループのすべての情報が含まれます。

の中に group_membersテーブルには、次のように各グループに属していないすべてのメンバーがリストされます。

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

基本的に、1つのページに3つのグループをリストし、4つ以上のメンバーを持つグループのみをリストします。 <?php while ?>ループ、そのグループに属していない4人のメンバーにしたい。グループを一覧表示し、メンバーを別の内部ループに一覧表示するのに問題はありません。4人以上のメンバーが表示されるようにグループを調整することはできません。

誰もこれを行う方法を知っていますか?私はそれがMySQLに参加していると確信しています。

34
hohner

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で使用しているキーのデータベーススキーマ内にインデックスを設定してください。

71
Nazariy
SELECT DISTINCT groups.id, 
       (SELECT COUNT(*) FROM group_members
        WHERE member_id = groups.id) AS memberCount
FROM groups
39
Reena Shirale

きみの groups_mainテーブルには、idという名前のキー列があります。 USING構文を使用できるのは、groups_fansテーブルには同じ名前のキー列がありますが、おそらくありません。代わりに、これを試してください:

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

または、group_idは、適切な列名がgroups_fansテーブル。

1
bbb

多分私はここでマークから外れており、OPを理解していませんが、なぜあなたはテーブルに参加していますか?

メンバーを持つテーブルがあり、このテーブルに「group_id」という名前の列がある場合、メンバーテーブルでクエリを実行するだけで、group_idでグループ化されたメンバーの数を取得できます。

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

結合を回避しているという理由だけで、オーバーヘッドは最小になりますが、それでも必要なものが得られるはずです。

グループの詳細や説明などが必要な場合は、メンバーテーブルからグループテーブルに結合を追加して名前を取得すると、最も迅速な結果が得られます。

0
crazeyez