varios una tipos tabla seleccionar optimizar lentas ejemplos datos consultas consulta campos mysql sql select sql-order-by limit

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