Mam taką tabelę:
CREATE TABLE post (
user_id INT,
type_id INT
);
Chciałbym wyciągnąć tych użytkowników, którzy:
- napisali przynajmniej 1 post o typie: 1
- napisali przynajmniej 1 post o typie: 3
- nie napisali żadnego postu o typie innym niż: 1
i 3
Mam kilka propozycji:
Wersja 1)
SELECT DISTINCT user_id
FROM post p1
WHERE EXISTS
(
SELECT 1
FROM post p2
WHERE p1.user_id = p2.user_id
AND type_id = 1
)
AND EXISTS
(
SELECT 1
FROM post p2
WHERE p1.user_id = p2.user_id
AND type_id = 3
)
AND NOT EXISTS
(
SELECT 1
FROM post p2
WHERE p1.user_id = p2.user_id
AND type_id NOT IN (1,3)
)
Wersja 2)
SELECT
user_id
FROM
post
GROUP BY
user_id
HAVING
COUNT(DISTINCT type_id) = 2
AND MAX(CASE WHEN type_id IN (1,3) THEN 0 ELSE 1 END) = 0
Wersja 3)
SELECT
user_id
FROM
(SELECT DISTINCT user_id, type_id FROM post) p
GROUP BY
user_id
HAVING
SUM(CASE WHEN type_id IN (1,3) THEN 1 ELSE 3 END) = 2
Wersja 4)
SELECT user_id FROM post WHERE type_id = 1
INTERSECT
SELECT user_id FROM post WHERE type_id = 3
EXCEPT
SELECT user_id FROM post WHERE type_id NOT IN (1, 3)
Wersja 5)
SELECT
user_id
FROM
post
GROUP BY
user_id
HAVING
COUNT(DISTINCT type_id) = 2
AND COUNT(DISTINCT CASE WHEN type_id NOT IN (1, 3) THEN type_id END) = 0
Każda z nich wydaje się działać, ale której powinienem używać? https://dbfiddle.uk/T3WbsQZ6