Domanda

Dato uno SCHEMA per l'implementazione dei tag

VOCE ItemId, ItemContent

TAG TagId, TagName

ITEM_TAG ItemId, TagId

Qual è il modo migliore per limitare il numero di ARTICOLI da restituire quando si seleziona con i tag?

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 

è ovviamente il modo più semplice per ripristinarli tutti, ma l'utilizzo di una clausola limit si interrompe, perché ottieni un duplicato di tutti gli elementi per ogni tag, che conta per il numero di righe in LIMIT.

È stato utile?

Soluzione

La mia seconda soluzione utilizza una funzione MySQL GROUP_CONCAT () per combinare tutti i tag corrispondenti all'elemento in una stringa separata da virgole nel set di risultati.

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 funzione GROUP_CONCAT () è una funzione MySQL, non fa parte dell'SQL standard.

Altri suggerimenti

Forse qualcosa del genere

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

Il mio primo suggerimento è di utilizzare una sottoquery per generare l'elenco di ID oggetto e restituire gli articoli corrispondenti a tali ID oggetto. Ma questo non include TagName nel set di risultati. Invierò una risposta separata con un'altra soluzione.

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')
);

Questa è una sottoquery non correlata, quindi un buon motore SQL dovrebbe scomporlo ed eseguirlo una sola volta.

Puoi anche usare Distinto / Raggruppa per:

SELEZIONA DISTINCT TagID, TagName FROM ((TAG T ITEM INGRESSO INTERNO_TAG I_T SU T.TagID = I_T.TagID) VOCE DI PARTECIPAZIONE INTERNA I SU I_T.ItemID = I.ItemID) GROUP BY TagID, TagName

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top