sql >> Database >  >> RDS >> PostgreSQL

Waarom is het resultaat van COUNT dubbel als ik er twee doe?

Dit is heel eenvoudig te beantwoorden. Je hebt twee record en twee alarm . Je sluit je hierbij aan en krijgt vier records, die je telt.

U kunt dit probleem omzeilen door verschillende ID's te tellen:

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

maar ik zou dit niet aanraden. Waarom doe je mee met record en alarm hoe dan ook? Ze zijn niet direct gerelateerd. Wat je wilt om mee te doen is het aantal record en het aantal alarm . Dus verzamel voordat je lid wordt:

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;

(Ik heb de onnodige join naar de "groeps"-tabel verwijderd.)



  1. CodeIgniter-configuratietekenset en UTF-8-ondersteuning

  2. Hoe TOON KARAKTERSET werkt in MariaDB

  3. Hoe kan ik MySQL-queryresultaten in CSV-indeling uitvoeren?

  4. ADD_MONTHS() Functie in Oracle