mysql - 通过使用下面提到的查询,我得到了错误的答案。有人可以解释为什么吗?
问题描述
产品
product_id 是该表的主键。
表:销售额
该表没有主键,它可以有重复的行。product_id 是 Product 表的外键。
编写一个 SQL 查询,报告购买了 S8 但没有购买 iPhone 的买家。
请注意,S8 和 iPhone 是 Product 表中的产品。
查询结果格式如下例:
产品表:
Product_id|product_name|Unit_price (1,S8,1000),(2,G4,800),(3,iphone,1400)
销售表:
|seller_id|product_id|buyer_id|sale_date|数量|价格|
(1,1,1,2019-01-21,2,2000)
(1,2,2,2019-02-17,1,800)
(2,1,3,2019-06-02,1,800)
(3,3,3,2019-05-13,2,2800)
结果表:
| 买家id|
| 1 |
id 为 1 的买家购买了 S8,但没有购买 iPhone。id 为 3 的买家购买了两者。
我的查询:
SELECT
distinct buyer_id
FROM
sales
WHERE product_id=1 and buyer_id not in (SELECT
buyer_id
FROM
sales
WHERE
product_id = 3);
有效的查询:
select distinct buyer_id
from Sales inner join Product
where Sales.product_id = Product.product_id
and product_name = 'S8'
and buyer_id not in
(select distinct buyer_id
from Sales inner join Product
where Sales.product_id = Product.product_id
and product_name = 'iPhone')
解决方案
是什么让您认为您的查询返回错误结果而另一个正确结果?两者都将返回相同的结果:
买家id
1
不?
它们之间的区别是第一个是直接使用product_id,因此不需要检查产品表(但在现实世界中并不现实,没有人会依赖这样的固定ID并记住它们)。问题是“S8”和“iPhone”,那么你应该从产品中获取 ID。
推荐阅读
- c# - 取消在 Prism EventAggregator 上排队的其他正在运行的任务
- javascript - 我收到一个错误,“发送后无法设置标头”,并且无论在 node.js 上如何,电子邮件上的错误消息都会不断出现
- ubuntu - 在 Ubuntu 18.04 上安装 Lisk
- java - Swing 中的 JavaFX 集成
- angular - Angular - 在@ViewChild 更改时“监听”
- axapta - 在 Dynamics AX 中检查供应商在过去 X 天内是否有跨所有公司的任何交易
- jquery - DOM 表搜索性能 JQuery
- c# - Android - 导航抽屉仅显示在一个活动c#中
- html - 错误:
属性变换:预期数字,“translate(NaN, 0)” - javascript - 仅检测第一次碰撞(使用光线投射进行碰撞检测)