sql >> Database >  >> RDS >> Mysql

Hoe ontwerp je een MySql-tabel voor een Tag Cloud?

Over het algemeen zijn er voor dit soort veel-op-veel-relaties drie tabellen:

  • Het "article " tafel
    • primaire sleutel =id
  • De "tag " tafel
    • primaire sleutel =id
    • bevat de gegevens van elke tag :
      • naam, bijvoorbeeld
  • Een "tags_articles " table, die fungeert als een join-tabel en alleen :
      . bevat
    • id_article :refererende sleutel die naar een artikel verwijst
    • id_tag :externe sleutel die naar een tag verwijst


Op deze manier is er geen verdubbeling van de gegevens van een tag:voor elke tag is er één en slechts één regel in de tag tafel.

En voor elk artikel kunt u meerdere tags hebben (d.w.z. meerdere regels in de tags_articles tafel); en natuurlijk kun je voor elke tag meerdere artikelen hebben.

Het verkrijgen van een lijst met tags voor een artikel, met dit idee, is een kwestie van een aanvullende vraag, zoals:

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


Het krijgen van de drie "meest gelijkende" artikelen zou betekenen:

  • selecteer artikelen met tags die het eerste artikel heeft
  • gebruik alleen die met het grootste aantal identieke tags

Niet getest, maar een idee zou er zo uit kunnen zien:

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

Kortom, jij:

  • selecteer de artikel-ID's voor elke tag die aanwezig is in uw eerste artikel
    • aangezien er een inner join is, als een artikel in de DB 2 tags heeft die overeenkomen met de where clausule, zonder de group by clausule, zouden er twee regels voor dat artikel zijn
    • u wilt natuurlijk niet het artikel dat u al had opnieuw selecteren -- wat betekent dat het moet worden uitgesloten.
  • maar, aangezien u group by article.id . gebruikt , er zal slechts één regel per artikel zijn
    • maar je kunt count gebruiken , om erachter te komen hoeveel tags elk artikel gemeen heeft met de eerste
  • dan is het alleen nog een kwestie van sorteren op aantal tags en alleen de derde drie regels krijgen.


  1. Querypunten binnen een bepaalde straal in MySQL

  2. Tel het aantal tekens in een tekenreeks met MySQL

  3. MySQL SELECTEER DISTINCT meerdere kolommen

  4. Fout bij het installeren van psycopg2==2.6.2