如何选择的ID有一组所有值的行

问题描述:

我想从有两个节目“篮球”和“足球”如何选择的ID有一组所有值的行

给定一个表像这样行的表中选择所有编号:

Id program 
1 basketball 
2 football 
3 basketball 
2 basketball 
1 football 
4 football 
5 basketball 

我怎样才能得到这样的结果:

id 
1 
2 
+0

SELECT 1 UNION SELECT 2 ;-) – Strawberry 2013-04-24 13:41:05

+0

请问 - 您的ID有什么问题?为什么有重复的价值观? – 2013-04-24 13:41:55

+0

我猜他们不是主键。 – 2013-04-24 13:42:41

既然你想返回有两个值的idfootballbasketball,可以使用以下方法得出结果:

select id 
from yt 
where program in ('basketball', 'football') 
group by id 
having count(distinct program) = 2; 

请参阅SQL Fiddle with Demo

由于也可以通过多次加入你的桌子上完成的:

select t1.id 
from yt t1 
inner join yt t2 
    on t1.id = t2.id 
where t1.program = 'basketball' 
    and t2.program = 'football'; 

SQL Fiddle with Demo

+1

+1不错的查询,不错的演示和快速! – Bohemian 2013-04-24 13:38:56

您可以INOR语法做到这一点:

SELECT id 
FROM table 
WHERE program = 'basketball' 
OR program = 'football'; 

如果你想只能得到前两个结果,最后加LIMIT 2

顺便说一句,如果没有主键的表是非常糟糕的做法,那么就没有办法为这个表编制索引,因此性能会很差。

+0

我不认为这是OP正在寻找... – 2013-04-24 13:41:35

+0

他可能正在寻找每个“程序”的第一个不同的结果。说实话,我认为他应该修正他的表格,而不是重复'id's,这对于学习SQL而言可能比如何选择不同的值(可以很容易地谷歌搜索)更重要。 – 2013-04-24 13:43:43

我觉得聚集是这个最普及的方法:

select id 
from table 
group by id 
having sum(case when program = 'Football' then 1 else 0 end) > 0 and 
     sum(case when program = 'Basketball' then 1 else 0 end) > 0 

sum()声明都指望分别有“足球”和“篮球”的行数。当存在时,该数字大于0.

+0

感谢这正是我正在寻找的! – 2013-04-24 17:06:12