Форум программистов, компьютерный форум, киберфорум
Наши страницы
MySQL
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
billybons2006
0 / 0 / 0
Регистрация: 13.09.2013
Сообщений: 15
1

Запрос из трех таблиц

16.12.2014, 14:21. Просмотров 850. Ответов 3
Метки нет (Все метки)

БД не мой профиль, к сожалению. Поэтому эта простая (как мне кажется) задачка меня в ступор вгоняет.

Есть три таблицы (см. рисунок во вложении).

Таблица: buyer (покупатели)
id head
1 Покупатель 1
2 Покупатель 2
3 Покупатель 3
4 Покупатель 4

Таблица: supplier (поставщики)
id head
1 Поставщик 1
2 Поставщик 2
3 Поставщик 3
4 Поставщик 4

Таблица: deal (сделки)
id buyer_id supplier_id comment
1 2 4 Коммент 1
2 3 3 Коммент 2
3 1 1 Коммент 3

Мне надо сформировать такую таблицу (см. рисунок):

Покупатель 1 Покупатель 2 Покупатель 3 Покупатель 4
Постав. 1 Коммент 3 - - -
Постав. 2 - - - -
Постав. 3 - - Коммент 2 -
Постав. 4 - Коммент 1 - -



Т.е. по идее все просто:
ДЛЯ каждого покупателя из таблицы buyer
ДЛЯ каждого поставщика из таблицы supplier
ВЫВЕСТИ из таблицы deal либо "-" (если ничего нет) либо comment.

Но неужели в этом случае перебор должен быть?

Для двух таблиц все решается примерно таким запросом:
MySQL
1
2
3
SELECT  `deal` . * 
FROM  `deal` 
LEFT JOIN  `product` ON  `deal`.`product_id` =  `product`.`id`
Но я не совсем понимаю, с какой стороны подойти к трем таблицам, чтобы получить таблицу, как в приложенном изображении.

С какой стороны зайти - мозг кипит уже ((
0
Миниатюры
Запрос из трех таблиц  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2014, 14:21
Ответы с готовыми решениями:

Запрос из трех таблиц
Приветствую всех. Подскажите, никак не соображу. Есть три таблицы. item: |...

Получить запрос из трех таблиц
Есть три таблицы: bar и food видаid|price | и items видаid|food | ...

Запрос для трех таблиц
Доброго времени суток! Имеется три таблицы Table_1, Table_2, Table_3 (на...

Запрос по выборке данных из трех таблиц
Привет всем, не могли бы вы помочь с запросом по выборке данных из трех таблиц?...

Связь таблиц и запрос на вывод из множеств таблиц
Добрый день! Вот решил создать базу данных и связать их, а потом вывести из...

3
cygapb-007
1306 / 938 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
16.12.2014, 14:58 2
billybons2006, сначала немного трансформируйте данные:
MySQL
1
2
3
4
5
6
7
8
select b.head
  ,if(d.supplier_id=1,d.comment,'-')as Покупатель1
  ,if(d.supplier_id=2,d.comment,'-')as Покупатель2
  ,if(d.supplier_id=3,d.comment,'-')as Покупатель3
  ,if(d.supplier_id=4,d.comment,'-')as Покупатель4
from deal d
join buyer b on b.id=d.buyer_id
order by b.head
Если в таком виде сразу записать нельзя (например, неизвестны заранее supplier.head), то придется использовать динамический SQL (DSQL). Где формировать аналогичный запрос - на клиенте или непосредственно в MySQL (с его PREPARE/EXECUTE) - дело вкуса.

Хотя с построением сводных (PIVOT) таблиц обычно лучше справляется клиентская часть, а не SQL-сервер
1
billybons2006
0 / 0 / 0
Регистрация: 13.09.2013
Сообщений: 15
16.12.2014, 15:24  [ТС] 3
Мало того, что неизвестны заранее, но еще и количество их неизвестно заранее. Я это забыл уточнить - второй день сижу, просто привык уже )) Т.е. может быть будет таблица из 25 покупателей, может быть меньше. Спасибо за идею.

Скорее всего, надо мудрить с созданием отдельной таблицы, в которую заносить спецом при внесении данных. Ну или еще как...

Пойду почитаю по динамический SQL. Даже не слышал такого слова.
0
cygapb-007
1306 / 938 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
16.12.2014, 17:56 4
что-то вроде этого (если говорить за "чистый" MySQL):
MySQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
select concat(
  'select s.head',
  group_concat(
    concat(',if(d.buyer_id=',b.id,',d.comment,''-'')',quote(b.head))
    order by b.head
    separator ''
    ),
  ' from deal d',
  ' join supplier s on s.id=d.supplier_id order by s.head')
into @sql
from (select distinct buyer_id from deal) d
join buyer b on b.id=d.buyer_id;
 
select @sql;
 
prepare myDSQL01 from @sql;
execute myDSQL01;
deallocate prepared myDSQL01;
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.12.2014, 17:56

Выборка из трех таблиц
Есть три таблицы: Таблица TOVAR (продукты) id товара|Название 22|Хлеб...

Связь трех таблиц
Добрый день! Есть такой вопрос, можно ли связать 3 таблицы? Есть 3...

Выборка из трех таблиц
Помогите пожалуйста, необходимо сделать выборку из трех таблиц. Допустим,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru