2012-05-24 224 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