Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Сложный SQL запрос  (Прочитано 24718 раз)
0 Пользователей и 1 Гость смотрят эту тему.
bebabo
Помогающий

ru
Offline Offline

WWW
« : 15-01-2015 17:12 » 

Всем привет!
Друзья, помогите справиться с запросом. Есть три основные таблицы А, B, C и две join-таблицы для связи многие-ко-многим: AC и BC. И нужно выбрать для строки из таблицы А все строки из таблицы B, объединенные только по общим связям с С.
Пример, А1 имеет связь с С1. B1 имеет связь с С1. B2 имеет связь с С1 и С2. Как построить запрос чтобы получить для А1 из B только B1, потому что есть общая связь с С1, и не получить B2, потому что у А1 нет связи с С2?
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 15-01-2015 17:46 » 

"AB и BC" - разве это не означает и "AC"?

Код: (SQL)
SELECT
  FROM a
    LEFT JOIN b ON b.id = a.id
    LEFT JOIN c ON c.id = b.id
  WHERE b.id IS NULL OR c.id IS NOT NULL
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
bebabo
Помогающий

ru
Offline Offline

WWW
« Ответ #2 : 15-01-2015 19:23 » new

RXL, привет! Спасибо за ответ, но не совсем то. Я плохо объяснил. В общем, есть покупатели (А), товары (С) и производители (В). Покупателям нравятся многие товары (АС), производители выпускают многие товары (ВС). Нужно для определенного покупателя выбрать только тех производителей, которые выпускают исключительно те товары, которые нравятся этому покупателю.
Записан

RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 15-01-2015 21:42 » 

Тогда нужны таблицы связи AC и CB.

Код: (SQL)
CREATE TABLE a (id ..., PRIMARY KEY (id));
CREATE TABLE b (id ..., PRIMARY KEY (id));
CREATE TABLE c (id ..., PRIMARY KEY (id));
CREATE TABLE ac (a ..., c ..., PRIMARY KEY (a, c));
CREATE TABLE cb (b ..., c ..., PRIMARY KEY (c, b));

Код: (SQL)
SELECT cb.b
  FROM ac
    JOIN cb ON cb.c = ac.c
  WHERE ac.a = ...
« Последнее редактирование: 16-01-2015 09:22 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 15-01-2015 22:59 » 

нужна еще таблица

лайков

customer_id product_id
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
HandKot
Молодой специалист

ru
Offline Offline

« Ответ #5 : 16-01-2015 06:00 » 

RXL, привет! Спасибо за ответ, но не совсем то. Я плохо объяснил. В общем, есть покупатели (А), товары (С) и производители (В). Покупателям нравятся многие товары (АС), производители выпускают многие товары (ВС). Нужно для определенного покупателя выбрать только тех производителей, которые выпускают исключительно те товары, которые нравятся этому покупателю.

получаем пары покупатель-продавец
Код:
select
abc.b
, abc.id
from (
Select
*
From
a ac, bc bc) abc
left join ac ac on ac.a = abc.id and ac.c = abc.c
group by
abc.b, abc.id
having count(distinct abc.c) = count(distinct ac.c)

ЗЫЖ а откуда такая задача, если не секрет? Похоже на какой-то тест
Записан

I Have Nine Lives You Have One Only
THINK!
bebabo
Помогающий

ru
Offline Offline

WWW
« Ответ #6 : 16-01-2015 07:43 » 

Всем спасибо! Сейчас буду пробовать)
HandKot, не, это не тест, это для интернет магазина. задача не совсем такая - без условия "которые выпускают исключительно те товары, которые нравятся этому покупателю", но когда делал стало любопытно, как сделать именно с исключением, понял, что не могу сформулировать это одним запросом )
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines