我有两个表:
文档类型:
doc_id | doc_name | expiry_days
-------|----------|-------------
1 | Doc_1 | 365
2 | Doc_2 | 90
3 | Doc_3 | 30
提供的文档:
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 查询 : Merge Results,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10734714/