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
)