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.
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.
SELECT DISTINCT groups.id,
(SELECT COUNT(*) FROM group_members
WHERE member_id = groups.id) AS memberCount
FROM groups
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
.
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.