Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 选择此项可在一行中从同一表中获取两个条目,按日期区分_Mysql_Sql_Date_Where Clause - Fatal编程技术网

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