una - Límite de MySQL con muchas a muchas relaciones
relacion uno a varios ejemplos (4)
Mi primera sugerencia es usar una subconsulta para generar la lista de identificaciones de ítems y devolver ítems que coincidan con esos ID de ítems. Pero esto no incluye TagName en su conjunto de resultados. Enviaré una respuesta por separado con otra solución.
SELECT i.ItemContent
FROM item AS i
WHERE i.id IN (
SELECT it.ItemId
FROM ItemTag AS it
INNER JOIN tag AS t ON (t.id = it.TagId)
WHERE t.TagName IN (''mysql'', ''database'', ''tags'', ''tagging'')
);
Esta es una subconsulta no correlacionada, por lo que un buen motor SQL debería factorizarla y ejecutarla solo una vez.
Dado un SCHEMA para implementar etiquetas
ITEM ItemId, ItemContent
TAG TagId, TagName
ITEM_TAG ItemId, TagId
¿Cuál es la mejor manera de limitar el número de ARTÍCULOS a devolver al seleccionar con etiquetas?
SELECT i.ItemContent, t.TagName FROM item i
INNER JOIN ItemTag it ON i.id = it.ItemId
INNER JOIN tag t ON t.id = it.TagId
es, por supuesto, la forma más fácil de recuperarlos a todos, pero el uso de una cláusula límite se rompe, porque se obtiene un duplicado de todos los elementos para cada etiqueta, que cuenta para el número de filas en LIMIT.
Mi segunda solución usa una función MySQL GROUP_CONCAT () para combinar todas las etiquetas que coinciden con el elemento en una cadena separada por comas en el conjunto de resultados.
SELECT i.ItemContent, GROUP_CONCAT(t.TagName ORDER BY t.TagName) AS TagList
FROM item AS i
INNER JOIN ItemTag AS it ON i.id = it.ItemId
INNER JOIN tag AS t ON t.id = it.TagId
GROUP BY i.ItemId;
La función GROUP_CONCAT () es una característica de MySQL, no es parte de SQL estándar.
Tal vez algo como
select i.ItemContent, t.TagName from (SELECT ItemId, ItemContent FROM item limit 10) i
INNER JOIN ItemTag it ON i.ItemId = it.ItemId --You will miss tagless items here!
INNER JOIN tag t ON t.id = it.TagId
También podría usar Distinct / Group By:
SELECT DISTINCT TagID, TagName FROM ((TAG T INNER JOIN ITEM_TAG I_T ON T.TagID = I_T.TagID) INNER JOIN ITEM I ON I_T.ItemID = I.ItemID) GROUP BY TagID, TagName