Das ist sehr einfach zu beantworten. Sie haben zwei record
und zwei alarm
. Sie treten diesen bei und erhalten vier Rekorde, die Sie zählen.
Sie können dieses Problem umgehen, indem Sie eindeutige IDs zählen:
COUNT(DISTINCT records.id) AS "last24HMessagesCount",
COUNT(DISTINCT alarms.id) AS "activeAlarmsCount"
aber das würde ich nicht empfehlen. Warum treten Sie record
bei und alarm
ohnehin? Sie sind nicht direkt verwandt. Was Sie wollen beizutreten ist die Nummer des record
und die Nummer des alarm
. Also aggregieren Sie vor dem Beitritt:
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;
(Ich habe den unnötigen Join zur Tabelle "group" entfernt.)