ver usuarios usuario remoto privilegios para eliminar create crear creacion all acceso mysql sql database

mysql - usuarios - mariadb create user grant all privileges



¿Cómo seleccionar un máximo de 3 artículos por usuario en MySQL? (3)

Primero seleccionaría 10 usuarios distintos, luego seleccionaría imágenes de cada uno de esos usuarios con un LÍMITE 3, posiblemente mediante una unión de todos esos y limitaría eso a 10.

Eso al menos reducirá los datos que necesita procesar a una cantidad justa.

Dirijo un sitio web donde los usuarios pueden publicar elementos (por ejemplo, imágenes). Los elementos se almacenan en una base de datos MySQL.

Quiero consultar los últimos diez artículos publicados, PERO con la limitación de un máximo de 3 elementos pueden provenir de un solo usuario.

¿Cuál es la mejor manera de hacerlo? Mi solución preferida es una restricción que se coloca en la consulta SQL que solicita los últimos diez elementos. Pero las ideas sobre cómo configurar el diseño de la base de datos son bienvenidas.

¡Gracias por adelantado!

BR


Es bastante fácil con una subconsulta correlacionada:

SELECT `img`.`id` , `img`.`userid` FROM `img` WHERE 3 > ( SELECT count( * ) FROM `img` AS `img1` WHERE `img`.`userid` = `img1`.`userid` AND `img`.`id` > `img1`.`id` ) ORDER BY `img`.`id` DESC LIMIT 10

La consulta supone que se agregaron medios de id más grandes más tarde

Las subconsultas correlacionadas son una herramienta poderosa. :-)


Esto es difícil porque MySQL no admite la cláusula LIMIT en subconsultas. Si lo hiciera, esto sería bastante trivial ... Pero, por desgracia, este es mi enfoque ingenuo:

SELECT i.UserId, i.ImageId FROM UserSuppliedImages i WHERE /* second valid ImageId */ ImageId = ( SELECT MAX(ImageId) FROM UserSuppliedImages WHERE UserId = i.UserId ) OR /* second valid ImageId */ ImageId = ( SELECT MAX(ImageId) FROM UserSuppliedImages WHERE UserId = i.UserId AND ImageId < ( SELECT MAX(ImageId) FROM UserSuppliedImages WHERE UserId = i.UserId ) ) /* you get the picture... the more "per user" images you want, the more complex this will get */ LIMIT 10;

No comentó sobre tener un orden de resultado preferido, por lo que selecciona las imágenes más recientes (suponiendo que ImageId es un valor ascendente de incremento automático).

Para la comparación, en SQL Server, el mismo se vería así:

SELECT TOP 10 img.ImageId, img.ImagePath, img.UserId FROM UserSuppliedImages img WHERE ImageId IN ( SELECT TOP 3 ImageId FROM UserSuppliedImages WHERE UserId = img.UserId )