@ATNC
Full-stack web\python developer

Как правильно сделать выборку?

Здравствуйте. Есть 2 таблички: Статья и Тег. У Статьи может быть несколько тегов. Связь М2М.
Скажите пожалуйста, как правильно сделать выборку, чтобы найти статьи с одинаковыми тегами? Например есть Статья у которой 2 каких-то Тега. Нужно найти Статьи, у котрых есть ровно 2 и таких же тегов.
Заранее спасибо.
  • Вопрос задан
  • 249 просмотров
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Можно так:
SELECT `a`.*
FROM `articles` AS `a`
JOIN (
  SELECT GROUP_CONCAT(DISTINCT `tag_id` ORDER BY `tag_id`) AS `tags` 
    FROM `articleTags`
    WHERE `article_id` = :articleId
) AS `at`
JOIN (
  SELECT GROUP_CONCAT(DISTINCT `tag_id` ORDER BY `tag_id`) AS `tags`, `article_id`
    FROM `articleTags`
    GROUP BY `article_id`
) AS `st` ON `st`.`article_id` = `a`.`id` AND `st`.`tags` = `at`.`tags`

Если пары (статья, тэг) уникальные, то DISTINCT можно убрать.
Ответ написан
Комментировать
terrier
@terrier
Вот так вот более читаемо

CREATE FUNCTION is_tags_equal(article1 text, article2 text)
RETURNS boolean AS
$$
SELECT NOT EXISTS 
	(
		(SELECT tag FROM articles_tags WHERE article = article1 
			EXCEPT 
		SELECT tag FROM articles_tags WHERE article = article2)
		UNION ALL
		(SELECT tag FROM articles_tags WHERE article = article2 
			EXCEPT 
		SELECT tag FROM articles_tags WHERE article = article1)
	)
$$
LANGUAGE sql;

SELECT article FROM articles WHERE is_tags_equal(article, 'ArticleName') AND article != 'ArticleName';
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы