sql >> Databasteknik >  >> RDS >> PostgreSQL

Varför blir resultatet av COUNT dubbelt när jag går med två?

Detta är väldigt enkelt att svara på. Du har två record och två alarm . Du går med i dessa och får fyra poster som du räknar.

Du kan lösa det här problemet genom att räkna distinkta ID:n:

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

men jag skulle inte rekommendera detta. Varför går du med i record och alarm i alla fall? De är inte direkt relaterade. Vad du vill ha att gå med är antalet record och antalet alarm . Så sammanställ innan du går med:

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;

(Jag har tagit bort den onödiga kopplingen till "grupp"-tabellen.)



  1. Finns det något sätt att "lyssna" efter en databashändelse och uppdatera en sida i realtid?

  2. Skriv ut resultatet av en mysqli SELECT-fråga

  3. PHP mysql_stmt::fetch() ger PHP Fatal-felminne uttömt

  4. Hur Atan2d() fungerar i PostgreSQL