Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Запрос из трёх таблиц


Автор: dirol 11.2.2014, 16:55
Добрый день.
Помогите организовать запрос на выборку данных из трёх таблиц.
Для простоты все данные в таблицах очень примерные:

Таблица 1. Orders
Код

idorder
nameorder

Таблица 2. Region_in_Orders
Код

id
idorder
idregion

Таблица 3. Regions
Код

idregion
nameregion


Суть:
* В таблице Orders содержатся абстрактные Заказы покупателей.
* Таблица Region_in_Orders является некой таблицей связки между таблицей Orders и справочником регионов (таблица Regions);
* Каждый заказ может быть доставлен в несколько регионов, значит в таблице Region_in_Orders может содержаться несколько записей с одинаковым значением idorder, но с разными значениями idregion;
* Но так как в таблице Region_in_Orders содержатся только идентификаторы регионов, наименование региона нужно получить из таблицы Regions. Допускается, что наименование нескольких регионов придёт в виде одной строки, где названия будут перечислены через запятую.
Т.е. в итоге мы должны получить примерно следующие данные:
Заказ № Orders.Idorder; Наименование: Orders.nameorder; Регионы: Regions.nameregion,Regions.nameregion и т.д.

Автор: Akina 11.2.2014, 17:29
В студию - Create Table всех таблиц, Insert Into данных в таблицы, желаемый результат на именно этих данных.

Цитата(dirol @  11.2.2014,  17:55 Найти цитируемый пост)
Допускается, что наименование нескольких регионов придёт в виде одной строки, где названия будут перечислены через запятую.

Какой [censored] это разрешил?

Автор: dirol 11.2.2014, 18:46
Код

CREATE TABLE IF NOT EXISTS `Orders` (
  `idorder` int(9) NOT NULL AUTO_INCREMENT,
  `nameorder` varchar(255) NOT NULL,
  PRIMARY KEY (`idorder`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=3 ;


INSERT INTO `Orders` (`idorder`, `nameorder`) VALUES
(1, 'На камчатку'),
(2, 'В сибирь (байкал)');

Код

CREATE TABLE IF NOT EXISTS `regions` (
  `idregion` int(9) NOT NULL AUTO_INCREMENT,
  `nameregion` varchar(255) NOT NULL,
  PRIMARY KEY (`idregion`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=7 ;

--
-- Дамп данных таблицы `regions`
--

INSERT INTO `regions` (`idregion`, `nameregion`) VALUES
(6, 'Приморск'),
(5, 'Сахалин'),
(3, 'Петропавлоск-Камчатский'),
(4, 'Чита');


Код

CREATE TABLE IF NOT EXISTS `Region_in_Orders` (
  `id` int(9) NOT NULL AUTO_INCREMENT,
  `idregion` int(9) NOT NULL,
  `idorder` int(9) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=4 ;

--
-- Дамп данных таблицы `Region_in_Orders`
--

INSERT INTO `Region_in_Orders` (`id`, `idregion`, `idorder`) VALUES
(1, 3, 1),
(2, 4, 2),
(3, 5, 1);


Результатом запроса должны стать строки таблицы orders, дополненные названием регионов.
Orders.idorder+' '+Orders.nameorder+' '+regions.nameregion,regions.nameregion

Цитата

Какой [censored] это разрешил?

Это как-то влияет на быстродействие?
Или неудобно при разборе?
Спасибо.

Автор: Akina 11.2.2014, 21:13
Цитата(dirol @ 11.2.2014,  19:46)
Результатом запроса должны стать строки таблицы orders, дополненные названием регионов.


Между понятиями "результат" и "рассказ, каким он должен быть", есть маленькая разница.

Добавлено через 1 минуту и 1 секунду
Цитата(dirol @ 11.2.2014,  19:46)
Цитата

Какой [censored] это разрешил?

Это как-то влияет на быстродействие?
Или неудобно при разборе?
Спасибо.

Это противоречит понятию "нормализация".

Автор: dirol 11.2.2014, 21:45
Цитата

Между понятиями "результат" и "рассказ, каким он должен быть"

Согласен. Извиняюсь.

Код

   idorder   |   nameorder   |   nameregion   |
        1       |   На камчатку |    Петропавлоск-Камчатский, Сахалин   |
        2       |  В сибирь (байкал)   | Чита   |

Автор: Akina 11.2.2014, 22:26
Код

SELECT o.idorder
     , o.nameorder
     , GROUP_CONCAT(r.nameregion ORDER BY ro.id ASC SEPARATOR ', ') nameregion
FROM Orders o
   , Regions r
   , Region_in_Orders ro
WHERE o.idorder = ro.idorder
  AND r.idregion = ro.idregion
GROUP BY o.idorder
--     , o.nameorder
;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)