2016-11-09 44 views
0

我遇到此查询以获得具有最大值的行。你能解释一下这是如何工作与'IS NULL'一起使用左连接

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); 
+0

该查询从2个表(每个表中3个)中检索6个字段,同时以表1中的PRICE字段小于表2中的PRICE字段和表2中的文章为空为条件对两个表的结果进行同步。根本没有MAX值处理。 – FDavidov

+0

@RyanVincent我不明白左连接条件如何与null条件一起工作,以得到期望的结果 – mercy

回答

1

查询进行自连接基于谓词:

s1.price < s2.price 

因此,该表中的每个记录加入到任何有更高价格的记录。

WHERE从句的谓语:

WHERE s2.article IS NULL 

true没有这样的记录存在。因此查询返回价格最高的记录。

+0

所以基本上,检查完成,直到没有更高的值(这是s2.article为空时)。那是对的吗? – mercy

+0

@mercy如果对于特定记录's2.article IS NULL = true',这意味着该记录使用'ON'子句的谓词不匹配。这意味着这个记录没有超过其“价格”价值的其他记录。 –

+0

我现在明白了..谢谢.. – mercy