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
操作符实际上并不直接转换为内部联接
,尽管asintersect
返回与所比较的集合公用的行,而联接根据给定条件进行过滤,并生成由联接集合中的行组成的新行集。处理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
操作符实际上并不直接转换为内部联接
,尽管asintersect
返回与所比较的集合公用的行,而联接根据给定条件进行过滤,并生成由联接集合中的行组成的新行集。处理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
操作符实际上并不直接转换为内部联接
,尽管asintersect
返回与所比较的集合公用的行,而联接根据给定条件进行过滤,并生成由联接集合中的行组成的新行集。处理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
操作符实际上并不直接转换为内部联接
,尽管asintersect
返回与所比较的集合公用的行,而联接根据给定条件进行过滤,并生成由联接集合中的行组成的新行集。处理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除外。或者是约翰、迈克、莎拉和艾比盖尔的三个