PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Perché il risultato di COUNT è doppio quando faccio due join?

È molto semplice rispondere. Hai due record e due alarm . Unisciti a questi e ottieni quattro record, che contati.

Puoi risolvere questo problema contando ID distinti:

COUNT(DISTINCT records.id) AS "last24HMessagesCount",
COUNT(DISTINCT alarms.id) AS "activeAlarmsCount"

ma non lo consiglierei. Perché ti iscrivi a record e alarm comunque? Non sono direttamente correlati. Quello che vuoi per partecipare è il numero di record e il numero di alarm . Quindi aggrega prima di unirti:

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;

(Ho rimosso il join non necessario alla tabella "gruppo".)