2015-05-26 57 views
1

解釋我的問題最簡單的方法可能是顯示錶和我試圖得到的結果。我最近嘗試查詢是在底部(不工作)基於mysql中多列的組行

我有以下表(刪除了一堆的簡單列):

客戶表:

------------------------- 
| client_id | name | 
------------------------- 
| client_1 | Bob  | 
------------------------- 
| client_2 | Jane | 
------------------------- 
| client_3 | Amy  | 
------------------------- 

合同表:

--------------------------------------------- 
| contract_id | client_id | amount | date | 
--------------------------------------------- 
| contract_1 | client_1 | $5  | 01/02 | 
--------------------------------------------- 
| contract_2 | client_1 | $25  | 21/03 | 
--------------------------------------------- 
| contract_3 | client_2 | $40  | 25/05 | 
--------------------------------------------- 

會話表:

------------------------------------------ 
| session_id | client_id | contract_id | 
------------------------------------------ 
| session_1 | client_1 | contract_1 | 
------------------------------------------ 
| session_2 | client_2 | contract_3 | 
------------------------------------------ 
| session_3 | client_2 | contract_3 | 
------------------------------------------ 
| session_4 | client_1 | contract_2 | 
------------------------------------------ 
| session_5 | client_1 | contract_1 | 
------------------------------------------ 

我需要CLIENT_ID和contract_id聯接表和組的所有行,像這樣:

client 1, Bob 
    |___ contract_1, $5, 01/02 
      |___ Session 1 
      |___ Session 5 
    |___ contract_2, $25, 21/03 
      |___ Session 4 
client 2, Jane 
    |___ contract_3, $40, 25/05 
      |___ Session 2 
      |___ Session 3 
client 3, Amy 

我最新的嘗試是做在表上進行完全外連接,並將結果按client_id和contract_id進行分組。

SELECT * FROM  
    (SELECT 
     * 
    FROM 
     contracts 
    LEFT OUTER JOIN 
     clients 
    ON 
     clients.client_id = contracts.client_id  
    UNION 
    SELECT 
     * 
    FROM 
     contracts 
    LEFT OUTER JOIN 
     sessions 
    ON 
     sessions.client_id = contracts.client_id) 
AS tmp_table GROUP BY client_id, contract_id 

完全外部聯接變通方法失敗,因爲列的各種表中的數量是不同的(我需要的所有列,所以我的運氣那裏的),它看起來像「GROUP BY」將返回只有1行中的每個的(這也爲我需要的所有行不會爲我工作。

性能沒有問題,在所有在這種情況下。


SQL fiddle based on Ronald's answer

它看起來像我所需要的。我會將其調整到我的生產表中,並在我批准答案之前查看是否有我忽略的內容

+0

SQL結果集採用固定列定義的表格形式。請將您想要的結果格式化爲表格,以便我們瞭解您正在嘗試執行的操作。 –

+1

此外,它將非常有用[sqlfiddle](http://sqlfiddle.com/)設置。 – mTorres

+0

@GordonLinoff我不確定最好的表格格式是什麼,這就是爲什麼我發佈我想要做的而不是表格。 – Sylverdrag

回答

1

以下查詢是否會給出所需的結果?

select cl.client_id, cl.name, co.contract_id, co.amount, co.date, se.session_id 
from (client cl left join contract co 
    on cl.client_id = co.client_id) left join session se 
       on co.contract_id = se.contract_id 
order by cl.client_id, co.contract_id, se.session_id 

(作爲一個評論已經指出:select語句的結果總是一個表)

和一個小問題:爲什麼是會話表的CLIENT_ID部分?它是超定的,這可能會導致數據庫中的歧義。