如何查询同一查询中的两个链接表?

时间:2016-10-13 16:32:59

标签: sql postgresql left-join

我有两张桌子。 device上可以有的blacklisted_device。我想获取包含特定user_ids且请求号为blacklisted_devices的设备数量。

这里有完整的sql来试试:

CREATE TABLE device (
  device_id serial PRIMARY KEY,
  user_id integer,
  updated_at timestamp default current_timestamp
);

CREATE TABLE blacklisted_device (
  blacklisted_id serial PRIMARY KEY,
  device_id integer,
  updated_at timestamp default current_timestamp,
  CONSTRAINT blacklisted_device_device_id_fkey FOREIGN KEY (device_id)
      REFERENCES device (device_id) MATCH SIMPLE
      ON UPDATE NO ACTION ON DELETE NO ACTION
);
INSERT INTO device (user_id)
VALUES (1),(2),(2),(7),(88),(99),(102),(106);

INSERT INTO blacklisted_device (device_id)
VALUES (1),(2),(3),(4);

SELECT COUNT(*) AS total_device
FROM device
WHERE user_id IN (7,88,99);

SELECT COUNT(*) AS blacklisted
FROM blacklisted_device
WHERE device_id IN (SELECT device_id FROM device WHERE user_id IN (7,88,99));

正如你在最后看到的那样,我得到了我想要的结果,但是在两个请求中。如何在一个请求中获得它?

total_device: 3, blacklisted: 1

随意对所有SQL做出任何评论,我可能犯了一些错误。

由于

1 个答案:

答案 0 :(得分:4)

您需要LEFT JOIN

SELECT  COUNT(*) AS total_device,
        COUNT(DISTINCT bd.device_id) AS blacklisted
FROM device d
LEFT JOIN blacklisted_device bd
    ON d.device_id = bd.device_id
WHERE d.user_id IN (7,88,99);