我想查询这句话:
Bars that are frequented by both Mike and John
[表常常由2列组成:饮酒者和他们去的酒吧]
我最初想过使用这个SQL查询,使用交叉运算符:
SELECT bar
FROM frequents
WHERE drinker ='Mike'
INTERSECT
SELECT bar
FROM frequents
WHERE drinker ='John'
但MySQL不支持使用Intersect运算符。我可能使用了Join运算符,但是我很难重写这个查询。
答案 0 :(得分:3)
这是你想要的inner join
:
SELECT a.bar
FROM frequents a
JOIN frequents b ON a.bar = b.bar
WHERE a.drinker = 'Mike'
AND b.drinker = 'John';
请注意,intersect会比较选择列表中的所有列,因此等效连接需要执行相同操作。在你的情况下,它只是一列。
intersect
运算符并不真正直接转换为inner join
,但intersect
会返回比较集合所共有的行,而联接会在给定条件下过滤并生成由连接集中的行组成的新行集。 <{1}}值的处理方式也存在差异(和重复)。
另一种选择是将null
谓词与相关子查询一起使用:
exists
或SELECT a.bar
FROM frequents a
WHERE a.drinker ='Mike'
AND EXISTS (
SELECT 1 FROM frequents b
WHERE a.bar = b.bar
AND b.drinker ='John'
);
谓词:
in
还有很多其他方法可以做到这一点,但我想我会停在这里:)
答案 1 :(得分:0)
一种简单的方法是使用聚合:
select f.bar
from frequents f
group by f.bar
having max(drinker = 'John') > 0 and
max(drinker = 'Mike) > 0;
或者:
select f.bar
from frequents f
where f.drinker in ('John', 'Mike')
group by f.bar
having count(*) = 2;
我喜欢having
条款,因为我发现它适用于各种各样的条件,例如John和Mike,但不是Sara。或约翰,迈克,萨拉和阿比盖尔三人。