mysql - 将普通查询转换为子查询会产生不同的结果
问题描述
我正在使用子查询(没有 JOIN)和普通(使用 JOIN)查询做一个问题,但最后,结果与这两个查询不同,我无法弄清楚这个问题。
问题是关于列出在这个平台上至少预订过两次的狗主人的详细信息
PET_OWNER(Owner_id,Oname,OAdd),
PET(Pet_id,Pname,PType),
BOOKING(Booking_num,Pet_id)
每个主人可能有 >=1 只狗,每只狗可能有 >=1 个预订
SELECT PET_OWNER.Owner_id,Oname,OAdd,COUNT(*) AS BOOKING
FROM PET_OWNER,
PET,
BOOKING
WHERE PET_OWNER.Owner_id = PET.Owner_id
AND PET.Pet_id = BOOKING.Pet_id
AND PType = 'DOG'
GROUP BY PET_OWNER.Owner_id, Oname, OAdd
HAVING COUNT(*) >=2
ORDER BY PET_OWNER.Owner_id;`
这是正常查询,显示哪个狗主人至少预订了两次
SELECT *
FROM PET_OWNER
WHERE Owner_id IN ( SELECT Owner_id FROM PET
WHERE Pet_id IN ( SELECT Pet_id FROM BOOKING)
AND PType = 'DOG'
GROUP BY Owner_id
HAVING COUNT(*) >1);
这个子查询的问题是,结果显示哪个主人至少有两只狗,但没有显示哪个狗主人至少预订了两次。子查询已自动向我显示不同的 pet_id,因此我不能指望表 Booking 中的 Pet_id,因为它始终只显示 1 **此子查询中不允许任何连接
我应该在子查询代码中进行哪些更改?我希望这两个查询有相同的结果
解决方案
join
您可以使用 a和获得至少两次预订的狗主人group by
:
select p.owner_id
from booking b join
pet p
on p.pet_id = b.pet_id
where p.type = 'Dog'
group by p.owner_id
having count(*) >= 2;
您可以通过多种方式获取详细信息。一个简单的方法使用in
:
select o.*
from owner o
where o.owner_id in (select p.owner_id
from booking b join
pet p
on p.pet_id = b.pet_id
where p.type = 'Dog'
group by p.owner_id
having count(*) >= 2
);
推荐阅读
- css - 如何去除卡入和设计的填充物?
- java - 包 Spring Java 中的实体列表
- r - 检查字符串等价性
- javascript - 如何将 css-loader 和 stylus-loader 添加到 nuxt.config.js 中?
- php - 数据插入后页面未在 Laravel 控制器中重定向
- c++ - 使用 cmake 将 OpenCV 作为外部的 C++ 项目
- android - gradle 3.2 无法在 android studio 3.2 中同步
- javascript - “开关”的打破是打破两个层次
- expression - 纯数据中 expr 对象的表达式评估不正确
- sql - UDF 不给出相同的结果