Обикновено за този вид връзка много към много има три таблици:
- „
article
" таблица- първичен ключ =идентификатор
- Маркерът
tag
" таблица- първичен ключ =идентификатор
- съдържа данните за всеки маркер :
- име, например
- A "
tags_articles
" таблица, която действа като таблица за присъединяване и съдържа само :id_article
:външен ключ, който сочи към статияid_tag
:външен ключ, който сочи към таг
По този начин няма дублиране на данни на нито един маркер:за всеки маркер има един и само един ред в tag
таблица.
И за всяка статия можете да имате няколко маркера (т.е. няколко реда в tags_articles
маса); и, разбира се, за всеки етикет можете да имате няколко статии.
Получаването на списък с тагове за статия с тази идея е въпрос на допълнителна заявка, като:
select tag.*
from tag
inner join tags_articles on tag.id = tags_articles.id_tag
where tags_articles.id_article = 123
Получаването на трите „най-сходни“ статии би означавало:
- изберете статии, които имат маркери, които има първата статия
- използвайте само тези, които имат най-важния брой идентични тагове
Не е тестван, но идеята може да е нещо, което би изглеждало така:
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
По принцип вие :
- изберете идентификаторите на статии за всеки маркер, който присъства в първоначалната ви статия
- тъй като има вътрешно присъединяване, ако дадена статия в БД има 2 маркера, които съответстват на
where
клауза, безgroup by
клауза, ще има два реда за тази статия - разбира се, не искате да избирате отново статията, която вече сте имали – което означава, че трябва да бъде изключена.
- тъй като има вътрешно присъединяване, ако дадена статия в БД има 2 маркера, които съответстват на
- но, тъй като използвате
group by article.id
, ще има само един ред на статия- но ще можете да използвате
count
, за да разберете колко маркера има общи за всяка статия с първоначалната
- но ще можете да използвате
- тогава е въпрос само на сортиране по брой маркери и получаване само на третите три реда.