mySQL创建一个包含2个表中3个行的所有行组合的视图?

时间:2014-08-15 20:11:55

标签: mysql

首先,这是我制作的sqlfiddle:http://sqlfiddle.com/#!2/b9d06c

我有3个表,项目,document_template和project_document。

  • 项目表包含项目ID和名称。
  • 文档模板表包含文档模板ID和模板名称。
  • 项目文档表包含一个ID,与之关联的项目ID和文档模板ID,以及发送日期。

我试图创建一个包含项目ID和文档模板ID的所有组合的视图,我可以使用

轻松完成
CROSS JOIN

但是,之后我想在名为' last_sent'的视图中添加一个额外的列。其中包含模板与项目一起使用的最新日期,为此,它必须查看project_document表中的信息。

我在sqlfiddle代码底部的评论中添加了一个示例,以显示它应该如何显示。

我尝试在视图查询的末尾添加不同的左连接,但似乎无法显示我想要的方式。 :(

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

SETUP:

基本上得到你的笛卡尔积...然后将project_id和document_template_id加入到最近的日期..那个日期需要在项目和doc_temp的id的单独选择中,以便你可以适当地加入它。在日期使用coalesce,以便当theres null值放入空白

QUERY:

SELECT 
    t1.project_id , t1.document_template_id , COALESCE(t.last_sent, ' ') AS last_sent
FROM
(   SELECT p.project_id, dt.document_template_id
    FROM project p, document_template dt
    GROUP BY project_id, document_template_id
) t1
LEFT JOIN
(   SELECT project_id, document_template_id, MAX(sent_on) AS last_sent 
    FROM project_document
    GROUP BY document_template_id
) t ON t.project_id = t1.project_id 
    AND t.document_template_id = t1.document_template_id;

输出:

+--------------+--------------------------+---------------------+
| project_id   | document_template_id     | last_sent           |
+--------------+--------------------------+---------------------+
| 1            | 1                        |                     |
| 1            | 2                        | 2014-08-12 10:00:23 |
| 1            | 3                        | 2014-07-11 08:12:40 |
| 2            | 1                        |                     |
| 2            | 2                        |                     |
| 2            | 3                        |                     |
+--------------+--------------------------+---------------------+

DEMO

答案 1 :(得分:0)

尝试

SELECT
    p.project_id,
    dt.document_template_id,
    MAX(pd.sent_on) AS last_sent
FROM project p
CROSS JOIN document_template dt
LEFT OUTER JOIN project_document pd 
     ON p.project_id=pd.project_id 
     AND dt.document_template_id=pd.document_template_id
GROUP BY p.project_id, dt.document_template_id
ORDER BY p.project_id, dt.document_template_id

如果您想要空而是使用COALESCE(MAX(pd.sent_on), '') AS last_sent代替

当您使用聚合函数作为MAX时,您应该通过GROUP BY子句指向组目标。否则,您将只返回一行。