2012-08-17 189 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