2013-10-27 114 views
0

我有以下查詢哪些工作(沒有「WHERE stats.dt」部分)。我獲得了所有用戶的數據。按WHERE子句選擇所有行

我的問題是,這個查詢當然會導致只有stats.dt> $ timestampnow- $ maxdays_data的用戶纔有行。但是我需要所有的用戶,但是當stats.dt大於tstamp-maxdays時,只需要獲取它們的SUM(upload)或SUM(download)值。如果stats.dt小於我需要的上傳和下載值的其他行可以忽略。

一個例子是,具有nodeid 2的用戶不會被選中,因爲他的dt太小。我確實希望用戶被選中,但沒有數據或上傳值(它們可以是0)。

的統計數據表看起來像這樣

nodeid | dt  | upload | download 
---------------------------------------- 
1  | 1381699533 | 345345 | 42324234 
1  | 1382899152 | 7575 | 574234 
1  | 1380699533 | 764534 | 7235232 
2  | 1372899152 | 71455 | 124123 

我不知道從哪裏開始尋找如何解決這個所以也許有人在那裏可以點我在正確的方向。謝謝!

SELECT b.id, b.lastname, b.name, c.balance, a.maxdebt, b.warndata, b.warndownload, b.warnupload, b.warndebt, b.cutoffdata, b.cutoffdownload, b.cutoffupload, b.cutoffdebt, b.data, b.download, b.upload, b.warning, b.access, b.cutoffstop 
FROM (
SELECT customers.id AS id, SUM(tariffs.value) AS maxdebt 
     FROM tariffs 
     LEFT JOIN assignments ON tariffs.id = assignments.tariffid 
     RIGHT JOIN customers ON assignments.customerid = customers.id 
     GROUP BY id 
) a 
JOIN (
SELECT customers.id AS id, UPPER(lastname) AS lastname, customers.name AS name, SUM(stats.upload+stats.download) AS data, SUM(stats.download) AS download, SUM(stats.upload) AS upload, customers.cutoffstop, warndata, warndownload, warnupload, warndebt, cutoffdata, cutoffdownload, cutoffupload, cutoffdebt, nodes.warning, nodes.access 
     FROM customers 
     LEFT JOIN nodes ON customers.id = nodes.ownerid 
     LEFT JOIN stats ON nodes.id = stats.nodeid 
     LEFT JOIN customerwarnings ON customers.id = customerwarnings.id 
     WHERE stats.dt > ($timestampnow-$maxdays_data) 
     GROUP BY id 
) b ON a.id = b.id 
JOIN (
SELECT customerid, SUM(cash.value) AS balance 
     FROM cash 
     GROUP BY customerid 
) c ON b.id = c.customerid 
+0

您可以對它使用SQL HAVING。 http://www.w3schools.com/sql/sql_having.asp – Dezigo

回答

0

這是一個強力的做法。它幾乎可以被簡化,但是如果不瞭解表和外鍵結構的更多信息,很難確定。

我所做的是取代sum(stats.download)sum(case when stats.dt > ($timestampnow-$maxdays_data) then s.download end)和類似的上傳。我也將b上的連接更改爲外連接:

Select 
    b.id, 
    b.lastname, 
    b.name, 
    c.balance, 
    a.maxdebt, 
    b.warndata, 
    b.warndownload, 
    b.warnupload, 
    b.warndebt, 
    b.cutoffdata, 
    b.cutoffdownload, 
    b.cutoffupload, 
    b.cutoffdebt, 
    b.data, 
    b.download, 
    b.upload, 
    b.warning, 
    b.access, 
    b.cutoffstop 
From (
    Select 
     c.id, 
     sum(t.value) as maxdebt 
    From 
     tariffs t 
      left join 
     assignments a 
      on t.id = a.tariffid 
      right join 
     customers 
      on a.customerid = c.id 
     Group by 
      c.id 
    ) a left outer join (
    Select 
     c.id, 
     upper(lastname) as lastname, 
     c.name, 
     sum(s.upload + s.download) as data, 
     sum(case when stats.dt > ($timestampnow-$maxdays_data) then s.download end) as download, 
     sum(case when stats.dt > ($timestampnow-$maxdays_data) then s.upload end) as upload, 
     c.cutoffstop, 
     warndata, 
     warndownload, 
     warnupload, 
     warndebt, 
     cutoffdata, 
     cutoffdownload, 
     cutoffupload, 
     cutoffdebt, 
     n.warning, 
     n.access 
    From 
     customers c 
      left join 
     nodes n 
      on c.id = n.ownerid 
      left join 
     stats s 
      on n.id = s.nodeid 
      left join 
     customerwarnings w 
      on c.id = w.id 
    Group By 
     c.id 
    ) b 
     On a.id = b.id 
     inner join (
    Select 
     customerid, 
     sum(cash.value) as balance 
    From 
     cash 
    Group By 
     customerid 
    ) c 
    on a.id = c.customerid 
+0

這很棒!謝謝。事實上,我認爲它可以被簡化,但是我的sql知識只是互聯網給我提供的東西:S我會在後面用我的表格來擴展我的帖子,如果你想看看它會很棒在它。 – user2886735