Mysql 不使用Intersect运算符重写SQL查询

Mysql 不使用Intersect运算符重写SQL查询,mysql,sql,querying,Mysql,Sql,Querying,我想对这句话提出质疑: Bars that are frequented by both Mike and John [餐桌常客包括两栏:饮酒者和他们去的酒吧] 我最初想到使用这个SQL查询,使用intersect操作符: SELECT bar FROM frequents WHERE drinker ='Mike' INTERSECT SELECT bar FROM frequents WHERE drinker ='John' 但是MySQL不支持使用Intersect操作符。我想可能

我想对这句话提出质疑:

Bars that are frequented by both Mike and John
[餐桌常客包括两栏:饮酒者和他们去的酒吧]

我最初想到使用这个SQL查询,使用intersect操作符:

SELECT  bar
FROM frequents
WHERE drinker ='Mike'
INTERSECT
SELECT bar
FROM frequents
WHERE drinker ='John'

但是MySQL不支持使用Intersect操作符。我想可能会使用连接运算符,但我很难重写此查询。

这是一个
内部连接
,您需要:

SELECT a.bar
FROM frequents a
JOIN frequents b ON a.bar = b.bar 
WHERE a.drinker = 'Mike'
  AND b.drinker = 'John';
请注意,intersect比较选择列表中的所有列,因此等效联接也需要这样做。在你的情况下,它只是一列

intersect
操作符实际上并不直接转换为
内部联接
,尽管as
intersect
返回与所比较的集合公用的行,而联接根据给定条件进行过滤,并生成由联接集合中的行组成的新行集。处理
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'
    );
或谓词中的

SELECT bar
FROM frequents
WHERE drinker ='Mike'
AND bar IN (SELECT bar FROM frequents WHERE drinker ='John')

还有很多其他方法可以做到这一点,但我想我就到此为止:)

这是一个
内部连接,您需要:

SELECT a.bar
FROM frequents a
JOIN frequents b ON a.bar = b.bar 
WHERE a.drinker = 'Mike'
  AND b.drinker = 'John';
请注意,intersect比较选择列表中的所有列,因此等效联接也需要这样做。在你的情况下,它只是一列

intersect
操作符实际上并不直接转换为
内部联接
,尽管as
intersect
返回与所比较的集合公用的行,而联接根据给定条件进行过滤,并生成由联接集合中的行组成的新行集。处理
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'
    );
谓词中的

SELECT bar
FROM frequents
WHERE drinker ='Mike'
AND bar IN (SELECT bar FROM frequents WHERE drinker ='John')

还有很多其他方法可以做到这一点,但我想我就到此为止:)

这是一个
内部连接,您需要:

SELECT a.bar
FROM frequents a
JOIN frequents b ON a.bar = b.bar 
WHERE a.drinker = 'Mike'
  AND b.drinker = 'John';
请注意,intersect比较选择列表中的所有列,因此等效联接也需要这样做。在你的情况下,它只是一列

intersect
操作符实际上并不直接转换为
内部联接
,尽管as
intersect
返回与所比较的集合公用的行,而联接根据给定条件进行过滤,并生成由联接集合中的行组成的新行集。处理
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'
    );
谓词中的

SELECT bar
FROM frequents
WHERE drinker ='Mike'
AND bar IN (SELECT bar FROM frequents WHERE drinker ='John')

还有很多其他方法可以做到这一点,但我想我就到此为止:)

这是一个
内部连接,您需要:

SELECT a.bar
FROM frequents a
JOIN frequents b ON a.bar = b.bar 
WHERE a.drinker = 'Mike'
  AND b.drinker = 'John';
请注意,intersect比较选择列表中的所有列,因此等效联接也需要这样做。在你的情况下,它只是一列

intersect
操作符实际上并不直接转换为
内部联接
,尽管as
intersect
返回与所比较的集合公用的行,而联接根据给定条件进行过滤,并生成由联接集合中的行组成的新行集。处理
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'
    );
谓词中的

SELECT bar
FROM frequents
WHERE drinker ='Mike'
AND bar IN (SELECT bar FROM frequents WHERE drinker ='John')

有很多其他方法可以做到这一点,但我想我将到此为止:)

一个简单的方法是使用聚合:

select f.bar
from frequents f
group by f.bar
having max(drinker = 'John') > 0 and
       max(drinker = 'Mike) > 0;
或:


我喜欢
having
子句,因为我发现它在很多情况下都是灵活的,比如John和Mike,但Sara除外。或者John、Mike、Sara和Abigail中的三个。

一个简单的方法是使用聚合:

select f.bar
from frequents f
group by f.bar
having max(drinker = 'John') > 0 and
       max(drinker = 'Mike) > 0;
或:


我喜欢
having
子句,因为我发现它在很多情况下都是灵活的,比如John和Mike,但Sara除外。或者John、Mike、Sara和Abigail中的三个。

一个简单的方法是使用聚合:

select f.bar
from frequents f
group by f.bar
having max(drinker = 'John') > 0 and
       max(drinker = 'Mike) > 0;
或:


我喜欢
having
子句,因为我发现它在很多情况下都是灵活的,比如John和Mike,但Sara除外。或者John、Mike、Sara和Abigail中的三个。

一个简单的方法是使用聚合:

select f.bar
from frequents f
group by f.bar
having max(drinker = 'John') > 0 and
       max(drinker = 'Mike) > 0;
或:

我喜欢
having
子句,因为我发现它在很多情况下都是灵活的,比如John和Mike,但Sara除外。或者是约翰、迈克、莎拉和艾比盖尔的三个