Pergunta

Dado um esquema para a implementação de tags

ITEM ItemId, ItemContent

TAG TagId, TagName

ITEM_TAG ItemId, TagId

Qual é a melhor maneira de limitar o número de itens para retornar ao selecionar com as marcações?

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 

é, naturalmente, a maneira mais fácil de obtê-los todos de volta, mas usando uma cláusula de limite de quebra, porque você começa uma cópia de todos os itens para cada tag, o que conta para o número de linhas em LIMIT.

Foi útil?

Solução

A minha segunda solução utiliza uma GROUP_CONCAT função MySQL () para combinar todas as tags correspondentes o item em uma string separada por vírgulas no 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;

A função GROUP_CONCAT () é uma função MySQL, não é parte do padrão SQL.

Outras dicas

Talvez 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

A minha primeira sugestão é usar uma subconsulta para gerar a lista de itens do ID do item e de retorno que correspondem a esses item de identificação. Mas isso não inclui o TagName no conjunto de resultados. Vou enviar uma resposta em separado com outra solução.

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 é uma subconsulta não correlacionada, assim que um motor de boa SQL deve fator-lo e executá-lo apenas uma vez.

Você também pode 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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top