Этот вопрос закрыт для ответов, так как повторяет вопрос SQL - сложный запрос многие ко многим?
@pressCode

Сложный SQL-запрос, нужен ли цикл?

Задача:

В базе данных имеется таблица с товарами offers (id INTEGER, name TEXT), таблица с тегамиtags (id INTEGER, name TEXT)и таблица связки товаров и тегов
tags_offers (tag_id INTEGER, offers_id INTEGER, UNIQUE (tag_id, offers_id))
.
Выведите id и названия всех товаров, которые имеют все возможные теги в этой базе.
Реализация - SQL запрос

Моя практика SQL сводится к написанию базовых запросов, потому не знаю с чего начать. Если бы это был не SQL, то я прошелся бы по массиву товаров в цикле пропуская товары, у которых нет всех тэгов - все очень просто. Но как такое реализовать в SQL, я ума не приложу. Может быть я неверно толкую задание (любители олимпиад по программированию нужна ваша помощь)?
  • Вопрос задан
  • 1708 просмотров
Решения вопроса 1
xEpozZ
@xEpozZ
Веб-разработчик
Можно решить многими способами, я придумал вот так:

SELECT offers.name
FROM offers, tags
LEFT JOIN tags_offers ON tags_offers.offers_id = offers.id
HAVING count(tags.id) = count(tags_offers.id)
Ответ написан
Ответы на вопрос 2
@li_bao
Найти все оффер, для которых не существует тега, который бы не был привязан к офферу.

select o.* from offers o
where not exists (select 1 from tags t
where not exists (select 1 from tags_offers t_o
where t_o.tag_id = t.id and t_o.offer_id = o.id))
Ответ написан
@molec
Самый простой вариант, наверное, с переменной:

declare @tags_count int
select @tags_count=count(*)
from tags;

select *
from offers as o
where o.id in
(
	select t_o.offers_id
	from tags_offers as t_o
	group by t_o.offers_id
	having count(*)=@tags_count
)
order by o.id;

Если очень хочется обойтись без переменных, можно выкрутиться, например, вот так:
select o.*
from offers as o
cross join 
(
select count(*) as tags_max_count
from tags
) as t
join 
(
	select t_o.offers_id, count(*) as tags_count
	from tags_offers as t_o
	group by t_o.offers_id
) as t_o
on o.id=t_o.offers_id
where t.tags_max_count=t_o.tags_count
order by o.id;
Ответ написан
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы