2010-10-30 31 views
3

我有一张桌子,其中我保持不同的米(水表,电表),并在另一个表中我保持每米的读数。 表结构是这样的: 仪表台选择以获得两个条目,从同一个表,按日期差异,在一行

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 

的问题是,我可能没有当前读数或前或者两者都有,但我仍然需要检索仪表信息。我完全可以得到NULL列,但我仍然需要一行:)

回答

2

用途:

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 

作为一个OUTER JOIN - 如果月份过滤的WHERE子句中完成的,它可以产生比不同的结果正在ON条款中完成。

+0

+1在'LEFT JOIN'上使用多重条件 – 2010-10-30 21:24:32

0

好吧,SQL的哲学是存储你所知道的。如果你不知道它,那么就没有任何行。如果您在搜索的记录集上执行过滤,并且找不到任何内容,则没有任何月份可以读取它。或者说,我不明白的问题

1

你可以使用子查询来从一个月前抢值:

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 
     ) 
+0

你的回答比较好,我投它并删除了我自己的。 – Knubo 2010-10-30 21:51:28

相关问题