Obecně pro tento druh vztahu many-to-many existují tři tabulky:
article
" tabulka- primární klíč =id
- Značka
tag
" tabulka- primární klíč =id
- obsahuje data každé značky :
- například jméno
tags_articles
" tabulka, která funguje jako spojovací tabulka a obsahuje pouze :id_article
:cizí klíč, který ukazuje na článekid_tag
:cizí klíč, který ukazuje na značku
Tímto způsobem nedochází k duplicitě dat žádné značky:pro každou značku je ve značce tag
jeden a pouze jeden řádek. tabulka.
A pro každý článek můžete mít několik značek (tj. několik řádků v tags_articles
stůl); a samozřejmě pro každý tag můžete mít několik článků.
Získání seznamu značek pro článek s touto myšlenkou je otázkou dodatečného dotazu, například:
select tag.*
from tag
inner join tags_articles on tag.id = tags_articles.id_tag
where tags_articles.id_article = 123
Získání tří „nejpodobnějších“ článků by znamenalo:
- vyberte články se štítky, které má první článek
- používejte pouze ty, které mají nejdůležitější počet identických značek
Netestováno, ale nápad by mohl vypadat takto:
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
V podstatě vy:
- vyberte ID článků pro každou značku, která se nachází v prvním článku
- protože existuje vnitřní spojení, pokud má článek v databázi 2 značky, které odpovídají
where
klauzule bezgroup by
klauzule, byly by pro tento článek dva řádky - samozřejmě nechcete znovu vybrat článek, který jste již měli – což znamená, že musí být vyloučen.
- protože existuje vnitřní spojení, pokud má článek v databázi 2 značky, které odpovídají
- ale když používáte
group by article.id
, na článek bude pouze jeden řádek- ale budete moci použít
count
, abyste zjistili, kolik tagů má každý článek společných s úvodním
- ale budete moci použít
- Pak je to jen otázka řazení podle počtu značek a získání pouze třetích tří řádků.