MySQL查询:合并结果

时间:2012-05-24 09:28:48

标签: mysql merge

我有两张桌子:

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),但是如果在DB中有该客户端和文档的条目,则填充日期的额外字段等。因此,对于每个客户端记录,我希望有14行,每个doc_type一行。其中一些行将包含特定于客户端的数据。

这样我在网格中就可以过滤client_id并查看所有文档的列表及其对该人的状态。

这可能吗?

1 个答案:

答案 0 :(得分: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