2つのテーブルがあります:groups
とgroup_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に参加していると確信しています。
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で使用しているキーのデータベーススキーマ内にインデックスを設定してください。
SELECT DISTINCT groups.id,
(SELECT COUNT(*) FROM group_members
WHERE member_id = groups.id) AS memberCount
FROM groups
きみの groups_main
テーブルには、id
という名前のキー列があります。 USING
構文を使用できるのは、groups_fans
テーブルには同じ名前のキー列がありますが、おそらくありません。代わりに、これを試してください:
LEFT JOIN groups_fans AS m ON m.group_id = g.id
または、group_id
は、適切な列名がgroups_fans
テーブル。
多分私はここでマークから外れており、OPを理解していませんが、なぜあなたはテーブルに参加していますか?
メンバーを持つテーブルがあり、このテーブルに「group_id」という名前の列がある場合、メンバーテーブルでクエリを実行するだけで、group_idでグループ化されたメンバーの数を取得できます。
SELECT group_id, COUNT(*) as membercount
FROM members
GROUP BY group_id
HAVING membercount > 4
結合を回避しているという理由だけで、オーバーヘッドは最小になりますが、それでも必要なものが得られるはずです。
グループの詳細や説明などが必要な場合は、メンバーテーブルからグループテーブルに結合を追加して名前を取得すると、最も迅速な結果が得られます。