如何使用Left Join来获取保持某一列最大值的行?

时间:2017-02-09 09:13:46

标签: mysql sql database

这是mysql5.6Documentation的一个例子。

假设MySQL数据库中有一个名为' shop'的表。表格中的每一行代表商店中的不同商品,其中包含字段'商品,'经销商'和'价格'。

为了找到最贵的项目,我可以简单地使用MySQL代码:

SELECT article, dealer, price
FROM shop
ORDER BY price DESC
LIMIT 1;

但是,如果我想使用LEFT JOIN来实现相同的效果呢? 文档表明我可以编写类似

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

我不太了解LEFT JOIN的用法,尤其是WHERE关键字后的条件。谁可以帮我这个事?我很感激你的帮助!

2 个答案:

答案 0 :(得分:3)

这个相当聪明的解决方案的关键是使用左连接和null&#34;其中&#34;条件。

左连接始终返回主表中的行,无论连接表中是否有匹配的行 - 与INNER连接完全不同(默认情况下,如果您只使用&#34; join&#34;),只有在两个表之间匹配时才返回行。

所以这里发生的是我们不是在原始字段上加入表,而是在派生值(s1.price&lt; s2.price)上加入表,这意味着主表中的价格较低,而加入的价格较高表

因此,如果没有更高的价格,我们知道我们选择了最高价格。在这种情况下,左连接表不会返回一行,因此我们检查的任何列都将为null。我们在where子句中检查哪个字段实际上并不重要 - 来自s2的任何字段都可以。

更多信息,请阅读有关联接类型的mysql文档:https://dev.mysql.com/doc/refman/5.7/en/join.html

答案 1 :(得分:0)

s1.price < s2.price在右表中找到比左边更贵的项目。如果左侧的商品价格不高,则右侧的article列将为null