首页 > 解决方案 > 如何简化这个sql

问题描述

我的 sql 表达式有问题,我想在主选择中放置不同的列,这些不同的列具有相同的 where 子句。

这是我的 sql 示例:

SELECT t.*,

  (SELECT monitor_value
   FROM sub_message s
   WHERE s.project_name=t.project_name
   ORDER BY monitor_time ASC
   LIMIT 1) AS project_start_val,

  (SELECT monitor_time
   FROM sub_message s
   WHERE s.project_name=t.project_name
   ORDER BY monitor_time ASC
   LIMIT 1) AS project_start_time
FROM sub_message t

标签: mysqlwhere-clausemysql5

解决方案


以下应该有效(未经测试):

select t.*,
  s2.monitor_value project_start_val,  
  s2.monitor_time project_start_time
from sub_message t
LEFT JOIN (select project_name pn, min(monitor_time) pt from sub_message group by project_name) s1 ON pn=t.project_name
LEFT JOIN sub_message s2 ON s2.project_name=s1.pn and s2.monitor_time=s1.pt

您仍然需要两次,并且只有 在 table 中的列是唯一的时LEFT JOIN它才会可靠地工作。但是,如果满足此条件,它为您提供了在查询中包含更多列的机会,而无需添加另一个子查询。project_name,monitor_timesub_messages2


推荐阅读