MySQL se une y CUENTA(*) desde otra tabla


Tengo dos tablas: groups y group_members.

La tabla groups contiene toda la información para cada grupo, como su ID, título, descripción, etc.

En la tabla group_members, enumera todos los miembros que están separados de cada grupo de la siguiente manera:

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

Básicamente, quiero enumerar TRES grupos en una página, y solo quiero enumerar grupos que tienen MÁS de cuatro miembros. Dentro del bucle <?php while ?>, entonces quiero cuatro miembros que estén separados de ese grupo. No tengo problemas. listando los grupos, y listando los miembros en otro bucle interno, simplemente no puedo refinar los grupos para que SOLO se muestren aquellos con más de 4 miembros.

¿alguien sabe cómo hacer esto? Estoy seguro de que es con MySQL joins.

Author: hohner, 2011-01-31

4 answers

MySQL usa TENIENDO la instrucción para estas tareas.

Su consulta se vería así:

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

Ejemplo cuando las referencias tienen nombres diferentes

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

Además, asegúrese de establecer índices dentro de su esquema de base de datos para las claves que está utilizando en las UNIONES, ya que puede afectar el rendimiento de su sitio.

 56
Author: Nazariy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-08 22:20:22
SELECT DISTINCT groups.id, 
       (SELECT COUNT(*) FROM group_members
        WHERE member_id = groups.id) AS memberCount
FROM groups
 33
Author: Reena Shirale,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-22 20:15:27

Su tabla groups_main tiene una columna clave llamada id. Creo que solo se puede usar la sintaxis USING para la combinación si la tabla groups_fans tiene una columna clave con el mismo nombre, lo que probablemente no tenga. Así que en su lugar, prueba esto:

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

O sustitúyase group_id por el nombre de columna que corresponda en la tabla groups_fans.

 1
Author: bbb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-05 14:12:57

Tal vez estoy fuera de lugar aquí y no entiendo la OP, pero ¿por qué te unes a las mesas?

Si tiene una tabla con miembros y esta tabla tiene una columna llamada "group_id", puede ejecutar una consulta en la tabla members para obtener un recuento de los miembros agrupados por el group_id.

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

Esto debería tener la menor sobrecarga simplemente porque estás evitando una unión, pero aún así debería darte lo que querías.

Si desea los detalles del grupo y la descripción, etc., agregue un unirse de la tabla miembros a la tabla grupos para recuperar el nombre le daría el resultado más rápido.

 0
Author: crazeyez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-10 10:08:58