Как построить запрос, включающий несколько разных таблиц с разными отношениями - PullRequest
1 голос
/ 15 августа 2011

В настоящее время я пытаюсь написать запрос, который включает 5 основных таблиц, 2 из которых относятся к третьей с внешними ключами, но не относятся друг к другу ... и одна из первых 2 таблиц является основной предмет запроса. Вот краткий обзор.

instance             user 
--------             ----
id                   id
name                 name
user_id


def                  def_map
---                  ------
id                   id
name                 instance_id
user_id              def_id


def_data
--------
id
name
def_id
user_id

То, что я хочу сделать, это получить список всех 'def_map's для одного пользователя. В каждой строке я хотел бы, чтобы связанные def_data также отображались. Таким образом, строки будут выглядеть так:

instance.id, def.id, def.name, def_data.name, user.id

Я могу выяснить, как получить всю информацию, кроме def_data.name в результате, или всю информацию, кроме instance.id ... но не могу понять, как получить все вместе, используя один запрос. Является ли это возможным? Я думаю, что часть проблемы в том, что я не знаю, есть ли специальное слово, описывающее этот тип запроса, поэтому я бы знал, что читать дальше.

Я использую DQL, но примеры в SQL были бы такими же полезными. Заранее благодарю за любую помощь.

Ответы [ 2 ]

0 голосов
/ 15 августа 2011
select I.id, D.id, D.name, DD.name, U.id
from user U inner join instance  I on I.user_id =  U.id
Inner join def D on D.user_id = U.id
inner join def_map DM on DM.def_id = D.id AND I.id = DM.instance_id
inner join def_data DD on DD.def_id = D.id AND U.id = DD.user_id

Данные испытаний:

USER                        
+----+-------------------------+
| id | name                    |
+----+-------------------------+
|  1 | Name1                   |
+----+-------------------------+                
Instance 

+----+------+---------+
| id | name | user_id |
+----+------+---------+
|  1 | I1   |       1 |
+----+------+---------+    
def_map    
+--------+-------------+--------+
|   id   | instance_id | def_id |
+--------+-------------+--------+
|      1 |           1 |  1     |
+--------+-------------+--------+

def
+--------------+------+
| id | name | user_id |
+--------------+------+
|  1 | df1  |      1  |
+--------------+------+

def_data
+--------+------+--------+---------+
|     id | name | def_id | user_id |
+--------+------+--------+---------+
|      1 | dd1  |      1 |       1 |
+--------+------+--------+---------+

Результат

+-------------+--------+----------+---------------+---------+
| instance.id | def.id | def.name | def_data.name | user.id |
+-------------+--------+----------+---------------+---------+
|           1 |      1 | df1      | dd1           |       1 |
+-------------+--------+----------+---------------+---------+

visual representation

0 голосов
/ 15 августа 2011

Если вы можете получить данные по отдельности, используя 2 запроса, вам просто нужно UNION их вместе

    SELECT user.id, i.id, d.id, dd.name 
    FROM user u  
    INNER JOIN instance i ON u.id=i.user_id
    INNER JOIN def d ON dm.user_id = u.id 
    INNER JOIN def_data dd ON dd.def_id = d.id  
    UNION ALL  
    SELECT u.id, i.id AS instance_id, d.id, dd.name  
    FROM instance i 
    INNER JOIN user u ON u.id=i.user_id
    INNER JOIN defmap dm ON dm.instance_id=i.id  
    INNER JOIN def_data dd ON dd.def_id=dm.def_id
...