【问题标题】:How using JOIN to sort table works?如何使用 JOIN 对表进行排序?
【发布时间】:2016-12-10 22:23:17
【问题描述】:

我正在浏览 mysql 文档,在 the common queries section 下,他们提到了如何使用 LEFT JOIN 获取表的最大列值。这是表格:

SELECT * FROM shop;

+---------+--------+-------+
| article | dealer | price |
+---------+--------+-------+
|    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 |
+---------+--------+-------+

这是查询:

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

有几件事情我不能正面或反面。

首先,没有任何LIMIT 1 语句或命令(这违背了JOIN 的目的),我不明白它如何只能返回一行(假设LEFT JOIN 是返回所有的LEFT OUTER JOIN左表中的行根据w3 Schools)。

其次,我不明白s1.price &lt; s2.price 的语义。这是否是说,“从s2 中选择所有行,其中声明s1.price &lt; s2.price 为真(如果是,那么上面的w3 学校链接对于mysql 不正确)?即LEFT JOINLEFT INNER JOIN

最后,WHERE s2.article IS NULL 对我来说毫无意义,因为表中的每条记录都有一个 article 属性(特别是因为没有模棱两可的 0000 文章)。

【问题讨论】:

  • where s2.article is null 表示(假设该字段不为空),s1 的详细信息只会在表中没有高于它的价格的项目中找到。

标签: mysql join


【解决方案1】:

加入条件s1.price &lt; s2.price 表示每个s1 行将加入每个具有更高价格的s2 行。

这意味着对于表 s1 中价格最高 (19.95) 的行,没有 s2 行将匹配。因为它在外连接中,所以无论如何都会返回不匹配的s1 行,但所有s2 列都将设置为null

where s2.article 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;

您将看到 1.25 s1 行与 6 s2 行连接,10.99 行与 1 行连接,而 19.95 则根本没有连接。

请注意,不保证只返回一行,如果多行以最高价格绑定,所有这些都将返回。

【讨论】:

  • 哦,真是天才。谢谢!
猜你喜欢
  • 2013-10-31
  • 1970-01-01
  • 2019-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多