使用左连接和“IS NULL”

问题描述 投票:0回答:2

我遇到这个查询来获取具有最大值的行。你能解释一下这是如何工作的吗

SELECT s1.article, s1.dealer, s1.price, s2.article, s2.dealer, s2.price
FROM shop s1
LEFT JOIN shop s2 ON s1.price < s2.price
WHERE s2.article IS NULL;

转储:

CREATE TABLE `shop` (
`article` int(4) unsigned zerofill NOT NULL DEFAULT '0000',
`dealer` char(20) NOT NULL DEFAULT '',
`price` double(16,2) NOT NULL DEFAULT '0.00',
PRIMARY KEY (`article`,`dealer`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `shop` VALUES 
(0001,'A',3.45), (0001,'B',3.99), 
(0002,'A',10.99),(0003,'B',1.45),
(0003,'C',1.69),(0003,'D',1.25),
(0004,'D',19.95);
mysql left-join
2个回答
2
投票

查询根据谓词执行自连接:

s1.price < s2.price

因此,表中的每条记录都会连接到任何具有更大价格的记录。

WHERE
子句的谓语:

WHERE s2.article IS NULL

不存在这样的记录

时,
true。因此,查询返回具有最高价格的记录。


0
投票

这个问题发布已经很长时间了,但能够澄清原因

WHERE s2.article IS NULL

使用的,我引用MySQL参考 “LEFT JOIN 的工作原理是,当 s1.price 处于最大值时,不存在具有更大值的 s2.price,因此相应的 s2.article 值为 NULL”

希望对遇到同样问题的人有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.