I allmänhet, för den här typen av många-till-många-relationer, finns det tre tabeller:
- "
article
" tabell- primär nyckel =id
tag
" tabell- primär nyckel =id
- innehåller data för varje tagg :
- namn, till exempel
- En "
tags_articles
" tabell, som fungerar som en sammanfogningstabell och innehåller endast :id_article
:främmande nyckel som pekar på en artikelid_tag
:främmande nyckel som pekar på en tagg
På detta sätt finns det ingen dubblering av någon taggs data:för varje tagg finns det en och bara en rad i tag
bord.
Och för varje artikel kan du ha flera taggar (dvs. flera rader i tags_articles
tabell); och, naturligtvis, för varje tagg kan du ha flera artiklar.
Att få en lista med taggar för en artikel, med denna idé, är en fråga om en ytterligare fråga, som :
select tag.*
from tag
inner join tags_articles on tag.id = tags_articles.id_tag
where tags_articles.id_article = 123
Att få de tre "mest lika" artiklarna skulle innebära:
- välj artiklar som har taggar som den första artikeln har
- använd bara de som har det viktigaste antalet identiska taggar
Inte testat, men en idé kan vara något som skulle se ut så här :
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
I grund och botten, du :
- välj artikel-id:n för varje tagg som finns i din första artikel
- eftersom det finns en inre koppling, om en artikel i DB har 2 taggar som matchar
where
sats, utangroup by
klausul, skulle det finnas två rader för den artikeln - naturligtvis vill du inte välja om artikeln du redan hade -- vilket betyder att den måste uteslutas.
- eftersom det finns en inre koppling, om en artikel i DB har 2 taggar som matchar
- men, eftersom du använder
group by article.id
, kommer det bara att finnas en rad per artikel- men du kommer att kunna använda
count
, för att ta reda på hur många taggar varje artikel har gemensamt med den första
- men du kommer att kunna använda
- då är det bara en fråga om att sortera efter antal taggar och bara få de tre tredje raderna.