Im Allgemeinen gibt es für diese Art von Viele-zu-Viele-Beziehungen drei Tabellen:
- Der "
article
" Tabelle- Primärschlüssel =ID
- Das "
tag
" Tabelle- Primärschlüssel =ID
- enthält die Daten jedes Tags :
- Name, zum Beispiel
- A "
tags_articles
"-Tabelle, die als Join-Tabelle fungiert und nur :- enthält
id_article
:Fremdschlüssel, der auf einen Artikel zeigtid_tag
:Fremdschlüssel, der auf ein Tag zeigt
Auf diese Weise gibt es keine Duplizierung der Daten eines Tags:Für jedes Tag gibt es eine, und nur eine, Zeile im tag
Tabelle.
Und für jeden Artikel können Sie mehrere Tags haben (d. h. mehrere Zeilen in den tags_articles
Tisch); und natürlich können Sie für jedes Schlagwort mehrere Artikel haben.
Eine Liste von Tags für einen Artikel zu erhalten, ist bei dieser Idee eine Frage einer zusätzlichen Abfrage, wie :
select tag.*
from tag
inner join tags_articles on tag.id = tags_articles.id_tag
where tags_articles.id_article = 123
Die drei "ähnlichsten" Artikel zu erhalten, würde bedeuten:
- Wählen Sie Artikel aus, die Tags haben, die der erste Artikel hat
- Verwenden Sie nur die, die die wichtigste Anzahl identischer Tags haben
Nicht getestet, aber eine Idee könnte so aussehen:
select article.id, count(*) as nb_identical_tags
from article
inner join tags_articles on tags_articles.id_article = article.id
inner join tag on tag.id = tags_articles.id_tag
where tag.name in ('php', 'mysql', 'erlang')
and article.id <> 123
group by article.id
order by count(*) desc
limit 3
Im Grunde genommen :
- Wählen Sie die Artikel-IDs für jedes Tag aus, das in Ihrem ursprünglichen Artikel vorhanden ist
- da es einen inneren Join gibt, wenn ein Artikel in der DB 2 Tags hat, die mit
where
übereinstimmen -Klausel, ohnegroup by
Klausel, würde es zwei Zeilen für diesen Artikel geben - Natürlich möchten Sie den Artikel, den Sie bereits hatten, nicht erneut auswählen – was bedeutet, dass er ausgeschlossen werden muss.
- da es einen inneren Join gibt, wenn ein Artikel in der DB 2 Tags hat, die mit
- aber, da Sie
group by article.id
verwenden , gibt es nur eine Zeile pro Artikel- aber Sie können
count
verwenden , um herauszufinden, wie viele Tags jeder Artikel mit dem ursprünglichen gemeinsam hat
- aber Sie können
- dann ist es nur noch eine Frage der Sortierung nach Anzahl der Tags und man bekommt nur die dritten drei Zeilen.