0

機能する次のクエリがあります(「WHERE stats.dt」部分なし)。すべてのユーザーにデータを取得します。

私の問題は、もちろん、このクエリが stats.dt > $timestampnow-$maxdays_data) を持つユーザーの行のみになることです。しかし、すべてのユーザーが必要ですが、SUM(upload) または SUM(download) の値は、stats.dt が tstamp-maxdays より大きい場合にのみ取得する必要があります。stats.dt が必要なサイズよりも小さい、upload と download の値を持つ他の行は無視できます。

たとえば、ノード ID が 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
4

1 に答える 1

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
于 2013-10-27T19:56:42.943 に答える