web-dev-qa-db-fra.com

MySQL rejoint et COUNT (*) depuis une autre table

J'ai deux tables: groups et group_members.

La table groups contient toutes les informations relatives à chaque groupe, telles que son ID, son titre, sa description, etc. 

Dans la table group_members, il répertorie tous les membres qui sont en dehors de chaque groupe, comme ceci:

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

En gros, je veux lister TROIS groupes sur une page et je veux seulement lister les groupes qui ont PLUS de quatre membres. Dans la boucle <?php while ?>, je veux ensuite quatre membres qui sont en dehors de ce groupe. Je n’éprouve aucune difficulté à répertorier les groupes et à répertorier les membres dans une autre boucle interne. Je ne peux tout simplement pas affiner les groupes de manière à ce que SEUL ceux qui ont plus de 4 membres soient visibles.

Est-ce que quelqu'un sait comment faire cela? Je suis sûr que c'est avec MySQL rejoint.

30
hohner

MySQL utilise AVEC instruction pour cette tâche.

Votre requête ressemblerait à ceci:

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

exemple lorsque les références ont des noms différents

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

Assurez-vous également que vous définissez des index dans le schéma de base de données pour les clés que vous utilisez dans JOINS, car cela peut affecter les performances de votre site.

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

Votre table groups_main a une colonne clé nommée id. Je pense que vous ne pouvez utiliser la syntaxe USING pour la jointure que si la table groups_fans a une colonne clé portant le même nom, ce qui n’est probablement pas le cas. Alors essayez plutôt ceci:

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

Ou remplacez group_id par le nom de colonne approprié figurant dans la table groups_fans.

1
bbb

Peut-être suis-je hors de propos ici et ne comprends pas le PO mais pourquoi rejoignez-vous les tables?

Si vous avez une table avec des membres et que cette table a une colonne nommée "group_id", vous pouvez simplement exécuter une requête sur la table members pour obtenir le nombre de membres groupés par group_id.

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

Cela devrait avoir le moins de frais généraux simplement parce que vous évitez une jointure, mais que vous devriez tout de même vous donner ce que vous vouliez. 

Si vous voulez les détails et la description du groupe, etc., ajouter une jointure de la table members à la table groups pour récupérer le nom vous donnerait le résultat le plus rapide.

0
crazeyez