2014-02-27 58 views
0

我有两个相关的表。 其中一张表包含照片的每个条目,另一张包含每张照片和用户信息的所有猫条目。选择从哪里不在 - 除了

photos table: 
id 
photo (unique filename) 
user 


cats tables 

photo 
user 
cat 

照片

1 photo1.jpg 40000 
2 photo2.jpg 40000 
3 photo3.jpg 40000 
4 photo4.jpg 40001 
5 photo5.jpg 40001 

photo1.jpg 40000 A 
photo2.jpg 40000 A 
photo1.jpg 40000 B 
photo1.jpg 40000 C 
photo2.jpg 40000 P 
photo3.jpg 40000 A 

每张照片可以被分配到多个类别为每个用户

我要的是选择所有照片用户40000是即使它们可能被包含在'A'或'B'猫中,也没有被包括在'P'猫中。

因为photo2.jpg包含在P猫中不应该出现在搜索结果中。 我的用户40000查询应给予如下因素的结果:

photo1 
photo3 
+0

请显示样本数据以及结果应该是什么样子,以及您迄今为止编写的代码。 – AgRizzo

+0

假设名为'cats.photo'的列包含'photos.id'中的值。目前还不清楚'photos.user'和'cats.user'之间有什么区别。你关心结果集中的照片是否在“A”或“B”类别中?或者你只关心他们*不在'P'类别中? –

+0

我编辑了我的问题 – valiD

回答

0

应该是一个简单的左加入/空试验

select 
     p.id, 
     p.photo 
    from 
     photos p 
     left join cats c 
      on p.photo = c.photo 
      AND c.cat = 'P' 
    where 
      p.user = 40000 
     and c.photo is null 

基本上,左连接仍然允许所有的照片合格。但是,如果连接明确地存在于类别表中并且由相同的照片AND category ='P',那么它将具有“c.photo”的值。所以在where子句中,我已经添加了只包含那些不存在(通过null)在猫表中存在。

+0

这也有诀窍。谢谢! – valiD

+0

@valiD,作为一个新手,并且根据您的内容数量的增长,您选择的另一个选项可能会显着降低性能。假设你有10,000张照片是猫'P',而用户40000只有10张照片,这个版本只会与10个相比,而不是10,000。但是你要求最终答案。 – DRapp

0
mysql> select * from photos 
     where photo not in (select photo from cats where cat='P') 
     and user = '40000'; 
+0

谢谢! :)这正是我所需要的。 – valiD

+0

性能可能取决于您建立的索引,上面的JOIN会导致大量重复行影响性能。所以子查询不一定是坏的,JOIN并不总是有更好的性能。https:// dev.mysql.com/doc/refman/5.6/en/subquery-optimization.html –