Question

J'ai deux tables: groups et group_members

.

Le tableau de groups contient toutes les informations pour chaque groupe, comme son ID, titre, description, etc.

Dans le tableau group_members, il énumère tous les membres qui sont en dehors de chaque groupe comme celui-ci:

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

En fait, je veux à la liste des groupes TROIS sur une page, et je ne veux que la liste des groupes qui ont plus de quatre membres. A l'intérieur de la boucle de <?php while ?>, je veux alors quatre membres qui sont en dehors de ce groupe. Je vais avoir aucun mal à la liste des groupes, et la liste des membres dans une autre boucle interne, je ne peux pas préciser les groupes afin que seuls ceux qui ont plus de 4 membres montrent.

Quelqu'un sait comment faire cela? Je suis sûr que ce soit avec MySQL rejoint.

Était-ce utile?

La solution

MySQL use HAVING statement for this tasks.

Your query would look like this:

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

example when references have different names

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

Also, make sure that you set indexes inside your database schema for keys you are using in JOINS as it can affect your site performance.

Autres conseils

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

Your groups_main table has a key column named id. I believe you can only use the USING syntax for the join if the groups_fans table has a key column with the same name, which it probably does not. So instead, try this:

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

Or replace group_id with whatever the appropriate column name is in the groups_fans table.

Maybe I am off the mark here and not understanding the OP but why are you joining tables?

If you have a table with members and this table has a column named "group_id", you can just run a query on the members table to get a count of the members grouped by the group_id.

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

This should have the least overhead simply because you are avoiding a join but should still give you what you wanted.

If you want the group details and description etc, then add a join from the members table back to the groups table to retrieve the name would give you the quickest result.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top