0

AとBの2つのテーブルがあり、Aにはエントリのリストが含まれ、Aにはエントリのリストが含まれ、Bには複数のステータス行(0-n、日付でグループ化され、ステータスは正常、1は失敗)が含まれます。

ここで、Aからすべての行を、それぞれの最新のステータスとその日付、および最新の障害とその日付(1で少なくとも1つのエントリがあると定義された障害)とともに選択したいと思います。

2つの左結合で何かを試しましたが、それが最適な解決策であるとは確信していません。また、正しい失敗数を決定する際にも問題があります(SUM(b2.status))

SELECT a.id, b1.date, SUM(b1.status), b2.date, SUM(b2.status) FROM tablea a
LEFT JOIN tableb b1 ON b1.aid=a.id
LEFT JOIN tableb b2 ON b2.aid=a.id

WHERE (b1.date=(SELECT MAX(`date`) FROM tableb WHERE aid=a.id) OR b1.date IS NULL)
AND (b2.date=(SELECT MAX(`date`) FROM tableb WHERE aid=a.id GROUP BY `date` HAVING SUM(`status`)>0) OR b2.date IS NULL)

GROUP BY a.id
4

4 に答える 4

0

このようなものが機能するはずです。

SELECT a.id, b1.date status_date, b1.status, b2.date latest_failure, 
       (SELECT COUNT(*) FROM tableb WHERE aid = a.id AND status > 0) total_failures

FROM tablea a

     LEFT JOIN tableb b1
     ON b1.aid = a.id
     AND b1.date = (SELECT MAX(date) FROM tableb WHERE aid = a.id)

     LEFT JOIN tableb b2
     ON b2.aid = a.id
     AND b2.date = (SELECT MAX(date) FROM tableb WHERE aid = a.id AND status > 0)

これは、tableb.dateフィールドが日時であり、一意であることを前提としています。それ以外の場合は、代わりにidフィールドを使用することをお勧めします。

于 2012-08-23T14:27:03.107 に答える
0

これもできます。どちらがより効率的かわからない。両方の方法で試すことができます。

SELECT a.id, b1.date status_date, b1.status, 
       (SELECT MAX(date) FROM tableb WHERE aid = a.id AND status > 0) latest_failure, 
       (SELECT COUNT(*)  FROM tableb WHERE aid = a.id AND status > 0) total_failures

FROM tablea a

     LEFT JOIN tableb b1
     ON b1.aid = a.id
     AND b1.date = (SELECT MAX(date) FROM tableb WHERE aid = a.id)
于 2012-08-23T14:29:49.300 に答える
0

これは機能するはずです。

SELECT a.id, MAX(b1.date) status_date, SUM(b1.status) latest_status, 
       (SELECT MAX(date) FROM tableb WHERE aid = a.id AND status > 0) latest_failure,
       (SELECT COUNT(*) FROM tableb  WHERE aid = a.id AND status > 0) total_failures

FROM tablea a

     LEFT JOIN tableb b1
     ON b1.aid = a.id
     AND b1.date = (SELECT MAX(date) FROM tableb WHERE aid = a.id)

GROUP BY a.id;

1日に複数の障害が発生する可能性があり、ステータスを「1」として表示したい場合は、次のように変更します。

SUM(b1.status)latest_status

に:

MAX(b1.status)latest_status。

于 2012-08-23T16:24:17.350 に答える
0

おっと、私がこれまでに行ったすべての仮定は間違っていたと思います。これであなたが望むものが得られると思います。障害が発生した最新の日付の障害の総数が表示されます。

非常に大きなデータベースでパフォーマンスがどのようになるかはわかりませんが、小さなデータベースでは正常に機能します。

SELECT a.id, MAX(b1.date) status_date, SUM(b1.status) latest_status, 
       b2.date latest_failure,
       b2.total_failures

FROM tablea a

     LEFT JOIN tableb b1
     ON b1.aid = a.id
     AND b1.date = (SELECT MAX(date) FROM tableb WHERE aid = a.id)

     LEFT JOIN 
     (SELECT aid, date, count(*) total_failures FROM tableb WHERE status > 0 GROUP BY aid, date) b2
     ON b2.aid = a.id
     AND b2.date = (SELECT MAX(date) FROM tableb WHERE aid = a.id AND status > 0)

GROUP BY a.id;
于 2012-08-23T16:54:58.287 に答える