varios una tabla solucion relacion optimizar muchos llenar lentas intermedia ejemplos ejemplo consultas como mysql database tags tagging

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