簡體   English   中英

使用連接表選擇與所有指定行匹配的行

[英]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'

一個要測試的SQLfiddle

嘗試加入兩個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM