Mysql 选择此项可在一行中从同一表中获取两个条目,按日期区分
我有一个表,我保存了不同的表(水表,电表),在另一个表中,我保存了每一个表的读数。 表结构如下所示: 仪表台Mysql 选择此项可在一行中从同一表中获取两个条目,按日期区分,mysql,sql,date,where-clause,Mysql,Sql,Date,Where Clause,我有一个表,我保存了不同的表(水表,电表),在另一个表中,我保存了每一个表的读数。 表结构如下所示: 仪表台 MeterID | MeterType | MeterName 阅读资料表: ReadingID | MeterID | Index | DateOfReading 仪表的读数每月读取一次。我现在要做的就是在一行中获取仪表信息、当前读数和之前读数。因此,如果我有一个查询,将产生以下行: MeterID | MeterType | MeterName | CurrnetIndex |
MeterID | MeterType | MeterName
阅读资料表:
ReadingID | MeterID | Index | DateOfReading
仪表的读数每月读取一次。我现在要做的就是在一行中获取仪表信息、当前读数和之前读数。因此,如果我有一个查询,将产生以下行:
MeterID | MeterType | MeterName | CurrnetIndex | LastIndex
到目前为止,我有以下疑问:
SELECT Meter.MeterID, Meter.MeterType, Meter.MeterName, CurrentReading.Index, PreviousReading.Index
FROM Meters AS Meter
LEFT OUTER JOIN Readings AS CurrentReading ON Meter.MeterID = CurrentReading.MeterID
LEFT OUTER JOIN Readings AS PreviousReading ON Meter.MeterID = PreviouseReading.MeterID
WHERE CurrentReading.ReadingID != PreviousReading.ReadingID AND DIMESTAMPDIFF(MONTH, CurrentReading.DateOfReading, PreviousReding.DateOfReading)=-1
问题是,我可能没有当前读数或先前读数,或两者都没有,但我仍然需要检索仪表信息。获取空列对我来说是完全可以接受的,但我仍然需要一行:)好吧,sql的原理是存储您所知道的内容。如果你不知道,那就没有任何争议了。如果对搜索的记录集进行筛选,但未找到任何内容,则不会有任何月份的读数。或者我不理解这个问题,您可以使用子查询获取一个月前的值:
select *
, (
select Index
from Readings r2
where r2.MeterID = m.MeterID
and DIMESTAMPDIFF(MONTH, r1.DateOfReading,
r2.DateOfReading) = -1
) as LastIndex
from Meter m
left join
Readings r1
on r1.MeterID = m.MeterID
另一个解决方案是允许第二个左连接失败。只需将where子句更改为:
WHERE PreviousReading.ReadingID is null
or
(
CurrentReading.ReadingID != PreviousReading.ReadingID
and
DIMESTAMPDIFF(MONTH, CurrentReading.DateOfReading,
PreviousReding.DateOfReading) = -1
)
使用:
作为外部联接-如果在WHERE子句中执行月份过滤,则它可能会产生与在ON子句中执行的结果不同的结果
SELECT m.meterid,
m.metertype,
m.metername,
current.index,
previous.index
FROM METER m
LEFT JOIN READING current ON current.meterid = m.meterid
AND MONTH(current.dateofreading) = MONTH(NOW())
LEFT JOIN READING previous ON previous.meterid = m.meterid
AND MONTH(current.dateofreading) = MONTH(NOW())-1