DROP SCHEMA tmp CASCADE;
CREATE SCHEMA tmp ;
SET search_path=tmp;
CREATE TABLE lutser
(id INTEGER NOT NULL
, category INTEGER NOT NULL
);
INSERT INTO lutser(category, id) VALUES
(1,1100) ,(1,1200) ,(1,1300) ,(1,1500)
,(2,2000) ,(2,2100) ,(2,2300) ,(2,2500)
,(1,3500) -- added these
,(2,3500)
;
는 이러한 쿼리는 카테고리 분류 == 1, 2 1 "비트 마스크"구성 == : 여기에 중복 행을 고려, 동시에 세 가지 질문에 대답하는 방법이다 2, 그들을 추가하십시오. 그래서 마스크는 id가 두 세트에 모두있는 경우 3, 첫 번째 세트에만있는 경우 1, 두 번째 세트에만있는 경우 2입니다. 외부 조인 + 합체가 트릭을 수행합니다. 두 쿼리 ;-)에 대한
--
-- CTE version
--
WITH flags AS (
WITH one AS (SELECT category AS flag , id FROM lutser WHERE category = 1)
, two AS (SELECT category AS flag , id FROM lutser WHERE category = 2)
SELECT COALESCE(one.flag, 0) + COALESCE(two.flag, 0) AS flag
FROM one
FULL OUTER JOIN two ON two.id = one.id
)
SELECT flag, COUNT(*)
FROM flags
GROUP BY flag;
--
-- Non-CTE version
--
SELECT COALESCE(one.flag, 0) + COALESCE(two.flag, 0) AS flags
, COUNT(*)
FROM (
SELECT category AS flag , id
FROM lutser WHERE category = 1
) one
FULL OUTER JOIN (
SELECT category AS flag , id
FROM lutser WHERE category = 2
) two ON two.id = one.id
GROUP BY flags;
결과 (:
flags | count
-------+-------
1 | 4
2 | 4
3 | 1
전문가들은 내가 FULL JOIN'는 MySQL을 지원하지 않습니다 '생각하는 빠른 :-) – vels4j