una - select mysql
MySQL selecciona las filas superiores con los mismos valores de condiciĆ³n (3)
Esta es la solución correcta, creo: necesita la subconsulta para saber cuánto puesto tiene el décimo lugar entre los diez primeros. Luego, usa la consulta externa para extraer a los usuarios con casi ese contador de correos.
SELECT u.username, COUNT(p.id) AS count
FROM Posts p
JOIN Users u ON u.id = p.author_id
GROUP BY p.author_id
HAVING COUNT(p.id) >=
(
SELECT COUNT(p.id) AS count
FROM Posts p
JOIN Users u ON u.id = p.author_id
GROUP BY p.author_id
ORDER BY count DESC
LIMIT 9, 1
)
ORDER BY count DESC
No sé cómo titular este problema. Corrígeme si tienes mejores palabras.
Tengo dos tablas, Usuarios y Publicaciones.
Usuarios:
id | username | password | ...
Publicaciones:
id | author_id | title | content | ...
Ahora quiero enumerar los usuarios "más activos": los usuarios que han escrito la mayoría de las publicaciones. Y específicamente, quiero los top 10
resultados.
SELECT u.username, COUNT(p.id) AS count
FROM Posts p, Users u
WHERE u.id=p.author_id
GROUP BY p.author_id
ORDER BY count DESC
LIMIT 10;
Puedo obtener el resultado esperado. Sin embargo, la clasificación puede no ser " justa " si algunos usuarios tienen la misma cantidad de publicaciones.
Por ejemplo, puedo obtener resultados como:
User 1 | 14
User 2 | 13
...
User 9 | 4
User 10 | 4
Aquí, en realidad hay varios usuarios más que tienen 4
publicaciones.
Entonces, los top 10
podrían ser exactamente 10
resultados. ¿Cómo puedo obtener un resultado más " justo " que contiene filas adicionales de usuarios que tienen 4
publicaciones?
Prueba esto:
SELECT username, PostCount
FROM (SELECT username, PostCount, IF(@PostCount = @PostCount:=PostCount, @idx:=@idx+1, @Idx:=1) AS idx
FROM (SELECT u.username, COUNT(p.id) AS PostCount
FROM Posts p
INNER JOIN Users u ON u.id=p.author_id
GROUP BY p.author_id
) AS A, (SELECT @PostCount:=0, @Idx:=1) AS B
ORDER BY PostCount DESC
) AS A
WHERE idx <= 10;
Tal vez no sea la mejor solución
select u.username, COUNT(p.id) AS count
FROM Posts p
join Users u on u.id = p.author_id
GROUP BY p.author_id
having COUNT(p.id) in
(
SELECT COUNT(p.id)
FROM Posts p
join Users u on u.id = p.author_id
GROUP BY p.author_id
ORDER BY count DESC
LIMIT 10
)
ORDER BY count DESC