mysql选择匹配多行

mysql选择匹配多行,mysql,select,Mysql,Select,我有一张看起来像的桌子 user project ---- ------- bob news bob theatre sarah news fred news fred fred fred movies sarah movies 如果用户从未fred 因此,基于上表的结果将是 bob theatre 我对如何实现这一目标感到困惑。我在另一个可以加入的表中有一个唯一的用户列表。我可以在某种语言中使用for循环来实现这一点,但我认为必须有一

我有一张看起来像的桌子

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子句只过滤掉这些值。

实现这一点的最简单方法可能是在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')

这是针对Microsoft SQL Server的;但是,这应该在MySQL上不加修改地运行

很好!!这很有效。我会接受这个答案。我想我甚至明白它为什么有效。我尝试了一些类似的东西,但没有空部分。使用
exists()
的性能不好。只有当你不得不使用它的时候-连接通常是首选。虽然,我承认它们更容易理解。我同意您的观点,即使用EXISTS()时性能并不总是最好的,但我认为这永远不会成为此类数据的问题。