MySQL se une y COUNT (*) de otra tabla
Pregunta
Tengo dos tablas: groups
y group_members
.
La tabla groups
contiene toda la información de 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 esta 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 los grupos que tienen MÁS de cuatro miembros.Dentro del ciclo <?php while ?>
, quiero a cuatro miembros que son parte de ese grupo.No tengo problemas para enumerar los grupos y enumerar a los miembros en otro ciclo interno, simplemente no puedo refinar los grupos para que SOLO aparezcan aquellos con más de 4 miembros.
¿Alguien sabe cómo hacer esto?Estoy seguro de que es con combinaciones de MySQL.
Solución
MySQL usa la declaración HAVING 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 JOINS, ya que puede afectar el rendimiento de su sitio.
Otros consejos
SELECT DISTINCT groups.id,
(SELECT COUNT(*) FROM group_members
WHERE member_id = groups.id) AS memberCount
FROM groups
Su tabla groups_main
tiene una columna clave llamada id
.Creo que solo 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.Entonces, en su lugar, intente esto:
LEFT JOIN groups_fans AS m ON m.group_id = g.id
O reemplace group_id
con el nombre de columna apropiado en la tabla groups_fans
.
Tal vez estoy equivocado aquí y no entiendo el 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 de miembros para obtener un recuento de los miembros agrupados por 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á evitando unirse, pero aún así debería darle lo que desea.
Si desea obtener los detalles y la descripción del grupo, etc., agregue una combinación de la tabla de miembros a la tabla de grupos para recuperar el nombre y obtener el resultado más rápido.