我有两个表:

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进行过滤,并查看该人的所有文档及其状态的列表。

这可能吗?

最佳答案

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的信息。

关于mysql - MySQL查询:合并结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10734714/

10-12 19:23
查看更多