[英]Select rows that match all specified rows using a join table
我正在嘗試編寫一個查詢,它將返回所有具有類別a和類別b的程序。 表結構如下:
程序
id
1000
1001
1002
Program_Category
program_id | category_id
1000 | 1
1000 | 2
類別
id | name
1 | category a
2 | category b
如您所見,程序1000具有類別a和類別b。 我試圖用來檢索程序的查詢是
SELECT DISTINCT t1.id
FROM PROGRAM t1
LEFT OUTER JOIN (PROGRAM_CATEGORY t2
JOIN CATEGORY t0 ON (t0.id = t2.category_id)
) ON (t2.program_id = t1.id)
WHERE ((t0.name = 'category a')
AND (t0.name = 'category b'))
這當前返回0行。
我無法猜測你的查詢嘗試了什么,但我認為這對你有用
SELECT count(*), p.ID FROM Program p
INNER JOIN Program_Category pc ON pc.program_id = p.id
INNER JOIN Category c ON pc.category_id = c.category_id
WHERE c.category_name = 'category a' or c.category_name = 'category b'
GROUP BY p.ID HAVING count(*) >= 2
這將使任何程序出現兩次匹配任何這些類別。
如果(program_id,category_id)不是唯一的鍵,這將不起作用。 我的意思是,如果Program_Category可以擁有兩對1000,1,那么這將失敗
常規JOIN
可以以相當直接的方式完成;
SELECT pc1.program_id
FROM program_category pc1
JOIN program_category pc2
ON pc1.program_id = pc2.program_id
JOIN category c1
ON c1.category_id = pc1.category_id AND c1.name = 'category a'
JOIN category c2
ON c2.category_id = pc2.category_id AND c2.name = 'category b'
嘗試加入兩個category
實例。 此查詢檢查p
是否與“類別a”和“類別b”相關,即使(program_id, category_id)
不唯一,它也會起作用:
SELECT distinct p.id
FROM PROGRAM p JOIN program_category pc1 ON p.id = pc1.program_id
JOIN category c1 ON pc1.category_id = c1.id
JOIN program_category pc2 ON p.id = pc2.program_id
JOIN category c2 ON pc2.category_id = c2.id
WHERE c1.category_name = 'category a'
AND c2.category_name = 'category b';
您正在訪問t0.id,根據您的表定義,它實際上是t0.category_id。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.