【问题标题】:MySQL Query: Merge ResultsMySQL 查询:合并结果
【发布时间】:2012-05-24 09:28:47
【问题描述】:

我有两张桌子:

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

这可能吗?

【问题讨论】:

    标签: mysql merge


    【解决方案1】:
    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

    【讨论】:

    • 您能否阐明如何使用 client_accounts 表来更改查询以使用它而不是子查询?
    猜你喜欢
    • 2012-04-23
    • 2010-11-12
    • 1970-01-01
    • 2011-12-09
    • 2014-09-10
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多