在mysql中的子查询之上创建视图

时间:2014-06-22 15:33:00

标签: mysql join subquery

我有一个查询,它从列中获取最大日期时间,以及从表中获取其他列的相应数据。但是为了选择最大日期时间,我必须使用子查询,以便获得其他列的相应值。但由于我使用带有别名的子查询,我无法在其上进行查看。因此,我的查询可以修改为给出我想要的结果,并且我能够使用该查询创建我的视图。

我为我的需求做的sql查询在下面。它给了我想要的结果但是我无法在查询之上查看。因此我不得不对separete视图进行查看以获得所需的结果。可以修改查询以给我结果,并且我能够在查询之上进行查看。

SELECT SD.a_n,SD.t_c,SD.ppl,date_time FROM(SD JOIN(SELECT SD.t_c,MAX(date_time)AS MDT FROM SD GROUP BY t_c)wn_m_d_t ON(((SD.t_c = wn_m_d_t。 t_c)AND(SD.date_time = wn_m_d_t.MDT))))WHERE((SD.t_c IN('drep','sred')))

2 个答案:

答案 0 :(得分:2)

您的查询格式更具可读性:

SELECT SD.a_n, SD.t_c, SD.ppl, date_time
FROM SD JOIN
     (SELECT SD.t_c, MAX(date_time) AS MDT
      FROM SD
      GROUP BY t_c
     ) wn_m_d_t
     ON SD.t_c = wn_m_d_t.t_c AND SD.date_time = wn_m_d_t.MDT
WHERE SD.t_c IN ('drep', 'sred');

MySQL有一个字符串限制,视图不能包含from子句中的子查询。您似乎想要在SD中获取每个t_c的最新日期的记录。这是另一种方法:

SELECT SD.a_n, SD.t_c, SD.ppl, SD.date_time
FROM SD
WHERE SD.t_c IN ('drep', 'sred') AND
      NOT EXISTS (select 1
                  from sd sd2
                  where sd2.t_c = sd.t_c and
                        sd2.date_time > sd.date_time
                 );

而且,这将在视图中起作用。 selectfrom子句中允许使用子查询。 这就是说,"在SD中获取所有行,其中没有相同t_c和更大date_time的记录。"

答案 1 :(得分:0)

我认为这个查询也可以不使用子查询。

SELECT SD.a_n, SD.t_c, SD.ppl, SD.date_time
FROM SD
LEFT JOIN SD AS sd2
 ON sd2.t_c = SD.t_c
 AND sd2.date_time > SD.date_time   
WHERE SD.t_c IN ('drep', 'sred') AND sd2.t_c IS NULL