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 verwijstid_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 degroup 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.
- aangezien er een inner join is, als een artikel in de DB 2 tags heeft die overeenkomen met de
- 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
- maar je kunt
- dan is het alleen nog een kwestie van sorteren op aantal tags en alleen de derde drie regels krijgen.