mysqlが別のテーブルから参加してカウント(*)
質問
私には2つのテーブルがあります: groups
と group_members
.
groups
テーブルには、ID、タイトル、説明など、各グループのすべての情報が含まれています。
の中に group_members
テーブル、このような各グループの一部であるすべてのメンバーをリストします。
group_id | user_id
1 | 100
2 | 23
2 | 100
9 | 601
基本的に、私はページに3つのグループをリストしたいと思っていますが、4人以上のメンバーを持つグループのみをリストしたいと思います。内側 <?php while ?>
ループ、私はそのグループの一部である4人のメンバーが欲しいです。グループをリストし、メンバーを別の内部ループにリストするのに問題はありません。グループを洗練することはできないため、メンバーが4人以上のメンバーのみが表示されます。
誰かがこれを行う方法を知っていますか? MySQLが参加していると確信しています。
解決
mysqlの使用 持っている このタスクの声明。
あなたのクエリは次のようになります:
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
また、サイトのパフォーマンスに影響を与える可能性があるため、結合で使用しているキーのデータベーススキーマ内にインデックスを設定するようにしてください。
他のヒント
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
これは、あなたが参加を避けているが、それでもあなたが望むものをあなたに与えるべきであるという理由だけで、最もオーバーヘッドを持つはずです。
グループの詳細や説明などが必要な場合は、メンバーテーブルからグループテーブルに戻って結合を追加して、名前を取得すると最速の結果が得られます。