2012-08-17 247 views
0

我有以下模式:SQL查詢許多一對多關係

Photo [id, name] 

Gallery [id, name] 

PhotoGallery [photo_id, gallery_id] 

每張照片可以屬於許多畫廊。 我需要做一個SQL(MySQL)查詢,這將允許我顯示不屬於某些畫廊的所有不同照片(按ID分組)。 例如,我們有以下數據:

Photo 
------ 
1 bunny 
2 rabbit 
3 eagle 

Gallery 
----- 
1 bunnies 
2 rabbits 
3 birds 

PhotoGallery 
----- 
1 1 
1 2 
2 2 
3 3 

我想選擇哪個不屬於畫廊「兔子」的所有照片。

結果應該是:

2兔

有什麼建議?查詢也應該很快,因爲我在數據庫中有大約10,000,000張照片。畫廊可以包含300,000張照片。

+0

能告訴你的SQL語句(S)到目前爲止,你已經試過了不是爲你工作?請參閱Stack Overflow中的[How To Ask](http://stackoverflow.com/questions/how-to-ask)頁面,特別是「做你的功課」部分。 – jadarnel27 2012-08-17 15:03:40

回答

2
SELECT * 
FROM photos 
WHERE photoID NOT IN (select photoid from photogalleries where galleryid=1) 
+0

此查詢在擁有10,000,000張照片的數據庫上表現出色嗎? – ehpc 2012-08-17 11:50:52

+0

我對此表示懷疑。除非你有一個擁有9,999,900張照片的畫廊,否則你會得到一個巨大的結果。 – podiluska 2012-08-17 11:53:20

+0

以下是與效果相關的文章 - http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql-server/ – 2012-08-17 12:09:08

0
SELECT 
     p.* 
FROM 
     photos p LEFT OUTER JOIN PhotoGallery pg on p.id = pg.photoid 
WHERE 
     pg.photoid IS NULL AND pg.galleryid = 1