MySql:从两条记录中返回一行数据

时间:2016-09-10 12:20:24

标签: mysql

我有一张桌子,其中贴纸包含水温,一份热水记录和一份冷水记录。

我要做的是构建一个查询,该查询将根据唯一ID返回两个记录,并且只生成包含热水和冷水数据的一行。

我已经读过这可以使用INNER JOIN完成,但正如您在下面看到的那样,我的查询返回两行,一行用于热水,另一行用于冷水。

是否可以生产一个包含热水和冷水的行?

这是我目前的查询:

SELECT h.UniqueID, h.Room, h.AuditDate, h.AuditBy, h.SeqID, h.WaterHot, h.WaterCold 
FROM NXLHR_Hist h 
INNER JOIN NXLHR_Hist b 
ON h.UniqueID = b.UniqueID 
WHERE h.WaterHot < '50' OR h.WaterHot > '66.0' OR h.WaterCold > '20.0' 
AND DATE(h.CompStamp) BETWEEN DATE('2015-09-08') AND DATE('2016-09-10')  
ORDER BY h.Room ASC 

即使我使用GROUP BY UniqueID,我仍然会得到两行。

任何帮助都会很棒,我会提前感谢您的时间。

问候。

2 个答案:

答案 0 :(得分:1)

SELECT h.UniqueID, h.Room, h.AuditDate, h.AuditBy, h.SeqID, h.WaterHot, h.WaterCold 
FROM NXLHR_Hist h 
INNER JOIN NXLHR_Hist b 
ON h.UniqueID = b.UniqueID 
WHERE h.WaterHot < '50' AND h.WaterHot > '66.0' AND h.WaterCold > '20.0' 
AND DATE(h.CompStamp) BETWEEN DATE('2015-09-08') AND DATE('2016-09-10')  
ORDER BY h.Room ASC 

使用此查询,希望它适合您

答案 1 :(得分:1)

据推测,这个WHERE条款可以更好地满足您的意图:

WHERE (h.WaterHot < 50 OR
       h.WaterHot > 66.0 OR
       h.WaterCold > 20.0
      ) AND 
      DATE(h.CompStamp) BETWEEN DATE('2015-09-08') AND DATE('2016-09-10')  

请注意括号。您似乎想要在该时间段内水温超出范围的任何记录。另外,我假设值是数字。不要在数字周围使用单引号;它对人们有误导性,有时会误导SQL优化器。

您的条件被解析为:

WHERE h.WaterHot < 50 OR
      h.WaterHot > 66.0 OR
      (h.WaterCold > 20.0 AND
       DATE(h.CompStamp) BETWEEN DATE('2015-09-08') AND DATE('2016-09-10')  
      )

实际上,我会把它写成:

WHERE (h.WaterHot < 50 OR
       h.WaterHot > 66.0 OR
       h.WaterCold > 20.0
      ) AND 
      h.CompStamp >= DATE('2015-09-08') AND
      h.CompStamp < DATE('2016-09-11')  

此版本允许引擎在CompStamp上使用索引。

您想要的查询可能看起来像这样:

SELECT h.Room, MAX(h.WaterHot), MIN(h.WaterHot), MAX(h.WaterCold)
FROM NXLHR_Hist h 
WHERE (h.WaterHot < 50 OR
       h.WaterHot > 66.0 OR
       h.WaterCold > 20.0
      ) AND 
      h.CompStamp >= DATE('2015-09-08') AND
      h.CompStamp < DATE('2016-09-11')  
 GROUP BY h.Room;