I need to get all aid
‘s values which have cid
!= 40 and cid
= 39 (many-to-many connection)
I’ve prepared two queries but i don’t know how to except second from first
x
SELECT DISTINCT aid FROM ac_branch WHERE aid IN (SELECT aid FROM ac_branch WHERE cid = 39);
SELECT DISTINCT aid FROM ac_branch WHERE aid IN (SELECT aid FROM ac_branch WHERE cid != 40);
Advertisement
Answer
It looks like you’re actually pretty close, is this what you’re looking for?
SELECT DISTINCT aid
FROM ac_branch
WHERE cid = 39
AND aid NOT IN (SELECT aid FROM ac_branch WHERE cid = 40)
;
Alternatively, you can do it without subqueries like so:
SELECT aid
FROM ac_branch
WHERE cid IN (39, 40)
GROUP BY aid
HAVING SUM(CASE WHEN cid=39 THEN 1 ELSE -1 END) = 1
;
Though, this assumes there can only be single entries for 39 and 40 for a given aid value. For example if there were two entries with aid=1 and cid=39, and none with cid=4, aid=1 would not appear (because the sum would be 2). Similarly, an aid with two 39’s and one 40 would also be included in the results.
A third option involves a JOIN
SELECT DISTINCT acb39.aid
FROM ac_branch AS acb39
LEFT JOIN ac_branch AS acb40
ON acb39.aid = acb40.aid AND acb40.cid = 40
WHERE acb1.cid = 39
AND acb40.aid IS NULL
;