it-swarm.com.de

MySQL verbindet sich mit COUNT (*) aus einer anderen Tabelle

Ich habe zwei Tabellen: groups und group_members.

Die groups-Tabelle enthält alle Informationen zu jeder Gruppe wie ID, Titel, Beschreibung usw. 

In der group_members-Tabelle werden alle Mitglieder aufgelistet, die von jeder Gruppe getrennt sind, wie folgt:

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

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

Weiß jemand, wie das geht? Ich bin mir sicher, dass es mit MySQL beitritt.

30
hohner

MySQL verwendet für diese Aufgaben die Anweisung MIT .

Ihre Anfrage würde so 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 Indizes für die in JOINS verwendeten Schlüssel in Ihrem Datenbankschema festlegen, da dies die Site-Leistung beeinflussen kann.

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

Ihre groups_main-Tabelle hat 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 Schlüsselspalte mit demselben Namen hat, was wahrscheinlich nicht der Fall ist. Versuchen Sie es stattdessen so:

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.

1
bbb

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

Wenn Sie über eine Tabelle mit Mitgliedern verfügen und diese Tabelle eine Spalte mit dem Namen "group_id" hat, können Sie einfach eine Abfrage für die Members-Tabelle ausführen, um die Anzahl der durch die group_id gruppierten Mitglieder abzurufen.

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

Dies sollte den geringsten Overhead haben, einfach weil Sie einen Join vermeiden, aber Ihnen trotzdem das geben, was Sie wollten. 

Wenn Sie die Gruppendetails und die Beschreibung usw. wünschen, fügen Sie der Gruppentabelle einen Join aus der Members-Tabelle hinzu, um den Namen abzurufen, der das schnellste Ergebnis liefert.

0
crazeyez