Limite MySQL con molte relazioni
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.
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