Объединение трёх таблиц - MySQL

Узнай цену своей работы

Формулировка задачи:

Здравствуйте. Прошу помочь или просто пнуть, в какую сторону читать. Есть 3 таблицы Switching_node, Switchs и UPS. Полностью приводить их смысла нет, приведу только то, участвует в запросе:

Switching_node

id KU_Name
1 КУ57-4

Switchs

id Name KU
1 A57-2-1 КУ57-4
2 A57-2-4 КУ57-4

UPS

id Inv_Number KU
1 UPS/001 КУ57-4
2 UPS/002 КУ57-4
Коротко - Switching_node - список коммуташек, Switchs - свичи, UPS - ибп. В таблицах Switchs и UPS поле KU определяет принадлежность к коммуташке. Нужно получить сводную по коммуташке. Делаю:
SELECT Switching_node.KU_Name, Switchs.Name, UPS.Inv_Nuber FROM Switching_node JOIN Switchs ON Switching_node.KU_Name=Switchs.KU JOIN UPS ON Switching_node.KU_Name=UPS.KU
Вывод:
KU_Name Name Inv_Nuber
КУ57-4 A57-2-1 UPS/001
КУ57-4 A57-2-4 UPS/001
КУ57-4 A57-2-1 UPS/002
КУ57-4 A57-2-4 UPS/002
Значений в таблицах конечно же больше и выборка по условиям в общем-то работает. Но как мне избавиться от декартова произведения(насколько я понимаю, именно оно здесь). Видеть же я хотел бы вот такой результат:
KU_Name Name Inv_Nuber
КУ57-4 A57-2-1 UPS/001
КУ57-4 A57-2-4 UPS/002
В идеале, конечно KU_Name должно быть объединённой ячейкой, но это не принципиально.

Решение задачи: «Объединение трёх таблиц»

textual
Листинг программы
SELECT val.KU_name, GROUP_CONCAT(DISTINCT val.Inv_number), GROUP_CONCAT(DISTINCT e.name) FROM Switchs e JOIN (SELECT q.id, q.KU_name, w.Inv_number FROM Switching_node q JOIN UPS w ON q.KU_name=w.KU) val ON e.KU=val.KU_name GROUP BY val.KU_name

Объяснение кода листинга программы

  1. В этом коде объединяются три таблицы: «Switchs», «Switching_node» и «UPS».
  2. Для этого используется оператор JOIN.
  3. В первом JOIN-соединении выбираются поля «id» и «KU_name» из таблицы «Switching_node», а также поле «Inv_number» из таблицы «UPS» на основе условия «q.KU_name=w.KU».
  4. Полученные результаты привязываются к таблице «Switchs» с помощью оператора JOIN по полю «KU».
  5. В итоговом запросе выбираются поля «val.KU_name», «GROUP_CONCAT(DISTINCT val.Inv_number)» и «GROUP_CONCAT(DISTINCT e.name)» из полученных результатов.
  6. Для получения уникальных номеров устройств в поле «Inv_number» используется функция DISTINCT.
  7. С помощью функции GROUP_CONCAT формируются строки из значений, которые будут соединены в одну строку.
  8. В итоговой строке каждая группа строк будет отделена символом «;».

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.143 из 5