2010-10-30 20 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

相關問題