Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie entwirft man eine MySQL-Tabelle für eine Tag Cloud?

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 zeigt
    • id_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, ohne group 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.
  • 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
  • dann ist es nur noch eine Frage der Sortierung nach Anzahl der Tags und man bekommt nur die dritten drei Zeilen.