これは答えるのがとても簡単です。 2つのrecord
があります および2つのalarm
。これらに参加して、カウントする4つのレコードを取得します。
個別のIDをカウントすることで、この問題を回避できます。
COUNT(DISTINCT records.id) AS "last24HMessagesCount",
COUNT(DISTINCT alarms.id) AS "activeAlarmsCount"
しかし、私はこれをお勧めしません。なぜrecord
に参加するのですか およびalarm
とりあえず?それらは直接関係していません。 欲しい 参加するのはrecord
の数です およびalarm
の数 。したがって、参加する前に集約します:
SELECT
device.id,
device.name,
records.cnt AS "last24HMessagesCount",
alarms.cnt AS "activeAlarmsCount"
FROM device
LEFT OUTER JOIN
(
SELECT deviceId, count(*) AS cnt
FROM record
WHERE "date" > '2017-07-12 11:43:02.838 +00:00'
GROUP BY deviceId
) AS records ON device.id = records.deviceId
LEFT OUTER JOIN
(
SELECT deviceId, count(*) AS cnt
FROM alarm
WHERE status = 'new'
GROUP BY deviceId
) AS alarms ON device.id = alarms.deviceId
WHERE device.serviceId = 1832
AND device.groupId = 205;
(「グループ」テーブルへの不要な結合を削除しました。)