Frage

Ich habe zwei Tabellen: groups und group_members.

Die groups-Tabelle enthält alle Informationen für jede Gruppe, wie z. B. ID, Titel, Beschreibung usw.

In der group_members-Tabelle werden alle Mitglieder, die zu jeder Gruppe gehören, wie folgt aufgelistet:

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

Grundsätzlich möchte ich DREI Gruppen auf einer Seite auflisten, und ich möchte nur Gruppen auflisten, die MEHR als vier Mitglieder haben.Innerhalb der <?php while ?>-Schleife möchte ich dann vier Mitglieder, die zu dieser Gruppe gehören.Ich habe keine Probleme, die Gruppen aufzulisten und die Mitglieder in einer anderen internen Schleife aufzulisten. Ich kann die Gruppen einfach nicht so verfeinern, dass NUR diejenigen mit mehr als 4 Mitgliedern angezeigt werden.

Weiß jemand, wie man das macht?Ich bin sicher, es ist mit MySQL-Joins.

War es hilfreich?

Lösung

MySQL verwendet für diese Aufgaben die Anweisung HAVING .

Ihre Anfrage würde folgendermaßen aussehen:

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

Beispiel, wenn Referenzen unterschiedliche Namen haben

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

Stellen Sie außerdem sicher, dass Sie in Ihrem Datenbankschema Indizes für Schlüssel festlegen, die Sie in JOINS verwenden, da dies die Leistung Ihrer Site beeinträchtigen kann.

Andere Tipps

SELECT DISTINCT groups.id, 
       (SELECT COUNT(*) FROM group_members
        WHERE member_id = groups.id) AS memberCount
FROM groups

Ihre groups_main-Tabelle enthält eine Schlüsselspalte mit dem Namen id.Ich glaube, Sie können die USING-Syntax für den Join nur verwenden, wenn die groups_fans-Tabelle eine gleichnamige Schlüsselspalte enthält, was wahrscheinlich nicht der Fall ist.Versuchen Sie stattdessen Folgendes:

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

Oder ersetzen Sie group_id durch den entsprechenden Spaltennamen in der groups_fans-Tabelle.

Vielleicht bin ich hier falsch und verstehe das OP nicht, aber warum verbinden Sie Tische?

Wenn Sie eine Tabelle mit Mitgliedern haben und diese Tabelle eine Spalte mit dem Namen "group_id" hat, können Sie einfach eine Abfrage für die Mitgliedertabelle ausführen, um die Anzahl der nach group_id gruppierten Mitglieder zu ermitteln.

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

Dies sollte den geringsten Overhead haben, nur weil Sie einen Join vermeiden, aber dennoch das geben sollten, was Sie wollten.

Wenn Sie die Gruppendetails und -beschreibungen usw. möchten, fügen Sie einen Join aus der Mitgliedertabelle zurück zur Gruppentabelle hinzu, um den Namen abzurufen. Dies führt zu dem schnellsten Ergebnis.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top