如何使用JOIN对表进行排序?

时间:2016-12-10 22:23:18

标签: mysql join

我浏览了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 JOINLEFT OUTER JOIN,它根据w3 Schools返回左表中的所有行。

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

最后,WHERE s2.article IS NULL对我来说完全没有意义,因为表格中的每条记录都有一个article属性(特别是因为没有含糊不清的0000文章)。< / p>

1 个答案:

答案 0 :(得分:2)

加入条件s1.price < s2.price表示每个s1行都会加入价格较高的s2行。

这意味着对于具有最高价格(19.95)的表s1中的行,不会有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行连一个,19.95个连接没有。

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