2016-11-09 59 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