2016-10-13 3 views
0

두 개의 테이블이 있습니다. blacklisted_device에있을 수있는 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에 대한 귀하의 의견을 자유롭게

, 나는 아마 몇 가지 실수를했다. 당신이 제공

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); 
+0

출력이 잘못 :

감사 –

답변

4

당신은 LEFT JOIN이 필요합니다. '블랙리스트에 올린 사람 : 3'이어야합니다.
+0

고맙습니다 @ 라 막은 완벽합니다. – Mio

관련 문제