PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Tại sao kết quả của COUNT nhân đôi khi tôi thực hiện hai kết hợp?

Điều này rất đơn giản để trả lời. Bạn có hai record và hai alarm . Bạn tham gia những thứ này và nhận được bốn bản ghi, bạn đếm được.

Bạn có thể giải quyết vấn đề này bằng cách đếm các ID riêng biệt:

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

nhưng tôi sẽ không giới thiệu điều này. Tại sao bạn tham gia recordalarm dù sao? Chúng không liên quan trực tiếp. Những gì bạn muốn tham gia là số lượng record và số alarm . Vì vậy hãy tổng hợp lại trước khi tham gia:

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;

(Tôi đã xóa phần tham gia không cần thiết vào bảng "nhóm".)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chuyển kết quả truy vấn cơ sở dữ liệu sang biểu đồ jQuery Sparkline bằng PHP

  2. Cách xóa nhiều hàng khỏi bảng được truy cập thường xuyên

  3. Tham gia hai bảng dựa trên dấu thời gian gần đó

  4. Các thông số có giá trị của bảng Postgresql JDBC

  5. Tạo và xóa cơ sở dữ liệu PostgreSQL trên Ubuntu 16.04