59

私は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の結合によるものだと確信しています。

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」という名前の列がある場合は、membersテーブルに対してクエリを実行するだけで、group_idによってグループ化されたメンバーの数を取得できます。

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

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

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

于 2017-11-10T10:08:58.913 に答える