mysql select match multiple rows

问题描述:

我有一张表,看起来像。mysql select match multiple rows

user project 
---- ------- 
bob  news 
bob  theatre 
sarah news 
fred news 
fred fred 
fred movies 
sarah movies 

我试图拉的项目清单,如果用户是从未fred

所以基于上述表中的结果将是。

bob theatre 

我对如何实现这一点很着迷。我可以加入另一个表中的唯一用户列表。我可以用某种语言的for循环做到这一点,但我认为必须有一种方法可以在本地sql中执行此操作。

select distinct a.* 
from mytable a 
left join mytable b on b.project = a.project and b.user = 'fred' 
where b.user is null 

对于要行,有不会是参加行和这样的行会null值,因此在where子句过滤掉只是那些。

+0

不错!这样可行。我会接受这个答案。我想我甚至会明白它为什么起作用。我正在尝试类似的东西没有零部分。 – user1757914

最简单的方法是在WHERE语句中使用NOT EXISTS运算符;是这样的:

Select P.* from Projects P Where NOT EXISTS (Select * from Projects P2 where P2.project = P.project and P2.user = 'fred') 

第二种可能性是使用NOT IN操作符:

Select P.* from Projects P Where P.project NOT IN (Select P2.project from Projects P2 where P2.user = 'fred') 

这是微软的SQL服务器;但是,这应该在MySQL上未修改运行。

+0

'exists()'表现不好。只有在必须时才使用它 - 连接通常是首选。虽然,我授予你他们更容易理解 – Bohemian

+0

我同意你的观点,当使用EXISTS()时,性能并不总是最好的,但我不认为这会在这种类型的数据中引起关注。 – SylvainL