PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Warum ist das Ergebnis von COUNT doppelt, wenn ich zwei Joins mache?

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.)