объединение одного и того же стола в разных отношениях - PullRequest
1 голос
/ 05 апреля 2019

у меня 3 таблицы.Пользователи, объекты и предметы.У пользователей может быть много объектов, а у объектов может быть много предметов.Кроме того, пользователи могут иметь много предметов.И я делаю отчет для этих таблиц.

Мой результат должен выглядеть следующим образом:

+------------+----------------+-----------------+
| username   | Object         | Item            |
+------------+----------------+-----------------+
|  1001      | Object_name1   | Item_name1      |
|  1001      | NULL           | Item_name2      |
|  1001      | NULL           | Item_name3      |
|  1001      | NULL           | Item_name4      |
|  1001      | NULL           | Item_name5      |
|  1002      | NULL           | Item_name6      |
+------------+----------------+-----------------+
and so on..

Лучшее, что я получаю с моим текущим запросом:

SELECT u.username, o.name as object, i.name as item, i1.name as item_1
FROM users as u
LEFT JOIN object_user as ou on ou.user_id = u.id
LEFT JOIN objects as o on o.id = ou.object_id
LEFT JOIN object_items as oi on oi.object_id = o.id
LEFT JOIN items as i on i.id = oi.item_id
LEFT JOIN item_user as iu on iu.user_id = u.id
LEFT JOIN items as i1 on i1 = iu.item_id
+------------+----------------+-----------------+-----------------+
| username   | Object         | Item            | Item_1          |
+------------+----------------+-----------------+-----------------+
|  1001      | Object_name1   | Item_name1      | Item_name2      |
|  1001      | Object_name1   | Item_name1      | Item_name3      |
|  1001      | Object_name1   | Item_name1      | Item_name4      |
|  1001      | Object_name1   | Item_name1      | Item_name5      |
|  1002      | NULL           | NULL            | Item_name6      |
+------------+----------------+-----------------+-----------------+

моя схема: enter image description here и, как видите, она неверна.Любой совет, как решить это?

1 Ответ

0 голосов
/ 05 апреля 2019

Вы можете использовать два раза соединение для одного элемента для объектов, связанных с объектами, и одно для пользовательских элементов

SELECT u.username, o.name as object, oi.name as oi_item_name, ui.name as ui_item_name
FROM users u
LEFT JOIN objects o on o.id = u.object_id 
LEFT JOIN items  oi on o.item_id  = oi.id
LEFT JOIN items ui on u.item_id  = ui.id 
...