Нужно написать(отредактировать мой) SQL запрос
Структуры таблиц:
Persons(person_id, name)
Product(product_id, name)
Deals(id,product_id,person_id)
Найти имена людей(Person), которые заключали сделки(deals) на все продукты.
Мой SQL запрос: (не рабочий)
SELECT persons.name from persons
WHERE
(
(SELECT DISTINCT deals.product_id from deals
WHERE deals.person_id = persons.person_id)
=
(SELECT products.product_id from products)
)
Ответы (2 шт):
Автор решения: goldstar_labs
→ Ссылка
SELECT persons.name from persons t
WHERE EXISTS (SELECT 1 FROM deals s WHERE s.person_id = t.person_id)
мог лажануть с синтаксисом)
Автор решения: Miron
→ Ссылка
Создание таблиц:
create table persons(
id int auto_increment primary key,
_name varchar(25)
);
create table products(
id int auto_increment primary key,
_name varchar(25)
);
create table deals(
id int auto_increment primary key,
product_id int references products.id,
person_id int references persons.id
);
Заполнение:
insert into persons
(_name)
VALUES
('Oleg'),
('Tanya'),
('Nadya');
insert into products
(_name)
VALUES
('bread'),
('water'),
('solt');
insert into deals
(product_id, person_id)
VALUES
(1, 1),
(2, 1),
(3, 1),
(2, 1),
(1, 2),
(2, 2),
(2, 2);
Идея запроса в следующем - сравнить количество уникальных продуктов вообще и количество уникальных продуктов, купленных данным человеком. Если эти величины равны, то этот человек купил все возможные товары.
Запрос:
SELECT
_name
FROM
persons
WHERE
(SELECT
COUNT(*)
FROM
(SELECT
product_id
FROM
deals
WHERE
person_id = persons.id
GROUP BY product_id) as t)
=
(SELECT
COUNT(*)
FROM
(SELECT
id
FROM
products
GROUP BY id) as t)
Вывод:
_name
Oleg