mysql - 如何使用 Left Join 获取某列最大值的行?

标签 mysql sql database

这是来自 mysql5.6Documentation 的示例.

假设在 MySQL 数据库中有一个名为“shop”的表。表格中的每一行代表商店中的不同商品,其中包含字段 'article'、'dealer' 和 'price'。

为了找到最贵的商品,我可以简单地使用 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关键字后面的条件。谁可以帮我这个事?非常感谢您的帮助!

最佳答案

这个相当聪明的解决方案的关键是使用左连接和空“where”条件。

左连接总是从主表返回行,无论连接表中是否有匹配的行 - 与 INNER 连接(如果您只使用“连接”时的默认设置)完全不同,它只在有匹配行时返回行是两个表之间的匹配项。

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

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

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

关于mysql - 如何使用 Left Join 获取某列最大值的行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42132450/

相关文章:

PHP 嵌套each/while

php - 帖子更新无需重新加载页面

mysql - 从同一个表中选择和删除

c# - 我的代码出现错误 : Cannot find table 0. 我做错了什么?

php - MySQL 数据库查询抛出错误,说我有语法错误。好像找不到他们?我相信它在查询的列部分

database - 数据库架构的目的是什么?

c# - 通过Wireshark检查Mysql查询进程

sql - 在新的数据库服务器上创建新的非对称 key 会导致旧数据失效吗?

按年份的 SQL 查询结果

java - 将 key 保存到 derby 数据库