Frage

Ich habe Artikel auf meiner Seite, und ich möchte Tags hinzuzufügen, die jeden Artikel beschreiben würde, aber ich bin für Tags Probleme mit Design-MySQL-Tabelle mit. Ich habe zwei Ideen:

  1. jeder Artikel würde Feld "Tags" hat und Tags im Format sein würden: "tag1, tag2, tag3"
  2. Erstellen andere Tabelle namens Schlüsselfelder: tag_name, article_id

Also, wenn ich Tags für Artikel möge mit der ID 1, würde ich laufen

SELECT ... FROM tags WHERE `article_id`=1;

Aber, ich möchte auch 3 ähnlichsten Artikel wissen, durch Tags zu vergleichen, so dass, wenn ich Artikel haben die Tags "PHP, MySQL, erlang" und 5 Artikel mit Tags hat: "PHP, MySQL", „erlang, Rubin“, "php erlang", "mysql, erlang, javascript", würde ich wählen, 1., 3. und 4., da diese 3 haben die meisten gleichen Tags mit Hauptartikel.

Auch andere Frage, was ist der beste Weg 10 „am häufigsten verwendeten Tags“ zu bekommen?

War es hilfreich?

Lösung

Im Allgemeinen für diese Art von many-to-many-Beziehung gibt es drei Tabellen:

  • Der "article" Tisch
    • Primärschlüssel = id
  • Der "tag" Tisch
    • Primärschlüssel = id
    • enthält die Daten eines jeden tag:
      • Name, zum Beispiel
  • A "tags_articles" Tabelle, die als Join-Tabelle wirkt, und enthält nur:
    • id_article: Fremdschlüssel, dass Punkte auf einen Artikel
    • id_tag: Fremdschlüssel die auf einen Tag


Auf diese Weise gibt es keine Vervielfältigung von Daten des Tags:. Für jeden Tag, es ist, und nur eine Zeile in der Tabelle tag

Und für jeden Artikel können Sie mehrere Tags (das heißt mehrere Zeilen in der tags_articles Tabelle) haben; und, natürlich, für jeden Tags können Sie mehrere Artikel haben.

eine Liste von Tags für einen Artikel bekommen, mit dieser Idee ist eine Sache von einer zusaetzliche Abfrage, wie:

select tag.*
from tag
    inner join tags_articles on tag.id = tags_articles.id_tag
where tags_articles.id_article = 123


Getting den drei „am ähnlichsten“ Artikel würde bedeuten:

  • Wählen Sie Artikel, die Tags haben, dass der erste Artikel hat
  • nur diejenigen verwenden, die die wichtigste Anzahl identischer-Tags

Nicht getestet, aber eine Idee könnte etwas sein, das würde wie folgt 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

Grundsätzlich Sie:

  • Wählen Sie die Artikel-IDs für jeden Tag, die auf Ihrem ersten Artikel vorhanden ist
    • da gibt es eine innere Verknüpfung, wenn ein Artikel in der DB 2-Tags hat, den die where Klausel entsprechen, ohne die group by Klausel, gäbe es für diesen Artikel zwei Linien
    • Sie natürlich wollen nicht wieder wählen Sie den Artikel, den Sie bereits hatte -. Was bedeutet, ausgeschlossen werden muss,
  • aber wie Sie group by article.id verwenden, wird es nur eine Zeile pro Artikel
    • , aber Sie werden in der Lage sein count zu verwenden, um herauszufinden, wie viele Tags jeder Artikel hat gemeinsam mit dem anfänglichen
  • dann, es ist nur eine Frage der Sortierung pro Anzahl von Tags, und nur die dritten drei Linien zu bekommen.

Andere Tipps

Zunächst einmal, Sie wollen Pascal MARTIN Vorschlag über den Tisch Design verwenden.

Wie für die Suche nach ähnlichen Artikel, hier etwas, um Ihnen den Einstieg. Da @article_id ist der Artikel, den Sie möchten, nach Übereinstimmungen zu finden, und @ tag1, tag2 @, @ tag3 sind die Tags für diesen Artikel:

SELECT article_id, count(*)
FROM tags_articles
WHERE article_id <> @article_id
AND tag_id IN (@tag1, @tag2, @tag3)
GROUP BY article_id
ORDER BY count(*) DESC
LIMIT 3

Ja, aber du hast nicht meine Haupt Frage beantworten, wie 3 am ähnlichsten Artikel zu bekommen?

Antwort: Achten Sie einfach auf den gleichen Tag-IDs in der fusionierten Tabelle (tags_articles). Sie sammeln und ein Muster erstellen.

Zum Beispiel: Artikel 1 hat tags: 1,2 Artikel 2 hat tags: 2,3,4 Artikel 5 hat tags: 6,7,2 Artikel 7 hat tags: 7,1,2,3

Wenn Sie die 3 am ähnlichsten Artikel für Artikel 1, wollen, müssen Sie sehen für die Tags 1,2. Sie finden Artikel 7 am ähnlichsten ist und 2 und 5 haben einige Gemeinsamkeiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top