Question

J'ai des articles sur mon site, et je voudrais ajouter des balises qui décrivent chaque article, mais je vais avoir des problèmes avec la table design MySQL pour les tags. J'ai deux idées:

  1. chaque article aurait champ "balises", et les balises serait au format: "balise1, tag2, tag3"
  2. créer d'autres balises appelé table avec des champs: tag_name, article_ID

Alors, quand je veux des tags pour l'article avec ID 1, je courrais

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

Mais, je voudrais aussi savoir 3 articles les plus semblables en comparant les étiquettes, donc si je l'article qui a des balises "php, mysql, Erlang", et 5 articles avec des tags: "php, mysql", « Erlang, Ruby », "php Erlang", "mysql, Erlang, javascript", je choisirais 1., 3. et 4., étant donné que les trois ont le plus mêmes balises avec l'article principal.

Aussi autre question, quelle est la meilleure façon d'obtenir 10 "tags les plus utilisés"?

Était-ce utile?

La solution

En général, pour ce genre de plusieurs à plusieurs, il y a trois tables:

  • La table "article"
    • clé primaire = id
  • La table "tag"
    • clé primaire = id
    • contient les données de chaque tag:
      • nom, par exemple
  • Une table « tags_articles », qui agit comme une table de jointure, et ne contient que:
    • id_article: clé étrangère qui pointe vers un article
    • id_tag: clé étrangère qui pointe vers une balise


De cette façon, il n'y a pas de duplication des données de toute étiquette. Pour chaque balise, il y a une, et une seule ligne dans la table tag

Et, pour chaque article, vous pouvez avoir plusieurs balises (à savoir plusieurs lignes dans la table tags_articles); et, bien sûr, pour chaque balises, vous pouvez avoir plusieurs articles.

Obtenir une liste des tags pour un article, avec cette idée, est une question d'une requête additionnelle, comme:

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


Obtenir les trois articles « plus similaires » signifierait:

  • articles choisis qui ont des étiquettes que le premier article a
  • utilisez uniquement ceux qui ont le nombre le plus important de balises identiques

Non testé, mais une idée peut-être quelque chose qui ressemblerait à ceci:

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

En fait, vous:

  • sélectionner les articles ids pour chaque balise qui est présente sur votre premier article
    • comme il y a une jointure interne, si un article dans la base de données dispose de 2 balises qui correspondent à la clause where, sans la clause group by, il y aurait deux lignes pour cet article
    • Bien sûr, vous ne voulez pas sélectionner à nouveau l'article que vous aviez déjà -. Ce qui signifie qu'il doit être exclu
  • mais, comme vous utilisez group by article.id, il n'y aura qu'une seule ligne par article
    • mais vous serez en mesure d'utiliser count, pour savoir combien de balises chaque article a en commun avec l'initiale
  • alors, il est seulement une question de tri par nombre de balises, et d'obtenir le troisième trois lignes.

Autres conseils

Tout d'abord, vous aurez envie d'utiliser la suggestion de Pascal MARTIN au sujet de la conception de la table.

Quant à trouver des articles similaires, voici quelque chose pour vous aider à démarrer. Étant donné que @article_id est l'article que vous souhaitez trouver des correspondances pour et @ balise1, @ tag2, @ tag3 sont les balises pour cet article:

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

Oui, mais vous ne l'avez pas répondu à ma question principale, comment obtenir 3 articles les plus semblables?

Réponse: Il suffit de regarder pour les mêmes étiquettes d'identification dans la table fusionnée (de tags_articles). les rassembler et créer un motif.

Par exemple: Article 1 a tags: 1,2 Article 2 a tags: 2,3,4 Article 5 a tags: 6,7,2 Article 7 a tags: 7,1,2,3

Si vous voulez que les 3 articles les plus semblables pour l'article 1, vous devez chercher les balises 1,2. Vous trouverez l'article 7 est le plus similaire et 2 et 5 ont quelques similitudes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top