[英]Reuse result of a correlated subquery
我有一個表media_tags
其中包含將媒體鏈接到用戶定義的標簽的兩列。 我想進行一些查詢,以選擇標簽上條件復雜的媒體。 我當前的解決方案是多次使用相同的相關子查詢。
多個SO答案已將我引向CTE,但據我所知,它們只能用於替換不相關的子查詢。
SELECT outer.media_id
FROM media_tags AS outer
WHERE 1 IN (SELECT tag_id FROM media_tags AS inner WHERE outer.media_id = inner.media_id)
AND 2 NOT IN (SELECT tag_id FROM media_tags AS inner WHERE outer.media_id = inner.media_id)
AND (3 IN (SELECT tag_id FROM media_tags AS inner WHERE outer.media_id = inner.media_id)
OR 4 IN (SELECT tag_id FROM media_tags AS inner WHERE outer.media_id = inner.media_id));
使用not exists
怎么樣?
SELECT m2.media_id
FROM media_tags mt
WHERE NOT EXISTS (SELECT tag_id
FROM media_tags mt2
WHERE mt2.media_id = mt.media_id AND
mt2.tag_id IN (1, 2, 3, 4)
);
您可以使用GROUP BY media_id
進行自我連接,並在HAVING
子句中設置條件:
SELECT outer.media_id
FROM media_tags AS outer INNER JOIN media_tags AS inner
ON outer.media_id = inner.media_id
GROUP BY outer.media_id
HAVING
SUM(inner.tag_id = 1) > 0
AND
SUM(inner.tag_id = 2) = 0
AND
SUM(inner.tag_id IN (3, 4)) > 0
如果沒有自連接,甚至更簡單,請檢查是否也可以:
SELECT media_id
FROM media_tags
GROUP BY media_id
HAVING
SUM(tag_id = 1) > 0
AND
SUM(tag_id = 2) = 0
AND
SUM(tag_id IN (3, 4)) > 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.