2012-05-24 264 views
0

我有兩個表:MySQL查詢:合併結果

doc_types:

doc_id | doc_name | expiry_days 
-------|----------|------------- 
    1 | Doc_1 | 365 
    2 | Doc_2 | 90 
    3 | Doc_3 | 30 

docs_supplied:

evidence_id | doc_id | client_id | date_supplied 
------------|---------|-----------|----------------- 
     1 | 1  | 5432 | 13-05-2012 
     2 | 1  | 3165 | 25-04-2011 
     3 | 2  | 5432 | 23-10-2011 

我想看到的輸出是:

doc_id | doc_name | expiry_days | client_id | date_supplied 
    -------|----------|-------------|-----------|---------------- 
    1 | Doc_1 | 365  | 5432 | 13-05-2012 
    2 | Doc_2 | 90  | 5432 | NULL  
    3 | Doc_3 | 30  | 5432 | NULL 
    1 | Doc_1 | 365  | 3165 | 25-04-2012 
    2 | Doc_2 | 90  | 3165 | NULL  
    3 | Doc_3 | 30  | 3165 | NULL 

基本上對於每個客戶,我想要以顯示文檔的完整列表(14),但是提供日期提供的額外字段等填充,如果該數據庫中有該客戶端和文檔的條目。因此,對於每個客戶記錄,我預計會有14行,每個doc_type一個。其中一些行將在其中包含客戶端特定的數據。

這是這樣的,在我的網格中,我可以過濾一個client_id並查看所有文檔及其狀態的列表。

這可能嗎?

+0

你有客戶餐桌嗎? – eggyal

+0

是的,當然,對不起。 – pierre

回答

2
SELECT doc_types.*, client_id, date_supplied 
FROM  doc_types 
    CROSS JOIN (SELECT DISTINCT client_id FROM docs_supplied) AS clients 
    LEFT JOIN docs_supplied USING (client_id, doc_id) 
ORDER BY client_id DESC, doc_id 

請參閱sqlfiddle

如果你有獨特的client_id列的表,你可以簡單地使用,而不是從SELECT DISTINCT子查詢生成它的:

SELECT doc_types.*, client_id, date_supplied 
FROM  doc_types 
    CROSS JOIN client_accounts 
    LEFT JOIN docs_supplied USING (client_id, doc_id) 
ORDER BY client_id DESC, doc_id 

瞭解SQL joins

+0

這太棒了,非常感謝。 SQL不是我的特長。 – pierre

+0

你能否澄清一下,如何使用client_accounts表,我會改變查詢來使用這個而不是子查詢? – pierre

+1

@pierre:看到我上面更新的答案。 – eggyal