我正在浏览MySQL文档,在the common queries section下,他们提到如何通过使用左连接获得表的最大列值。这是桌子:

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是根据w3 Schools返回左表中所有行的LEFT OUTER JOIN)。
其次,我不理解s1.price < s2.price的语义。这是不是说,“从s2中选择所有行,其中s1.price < s2.price语句是真的(如果是,那么上面的w3 schools链接对于mysql不是真的)?即LEFT JOIN是一个LEFT INNER JOIN吗?
最后,WHERE s2.article IS NULL对我来说毫无意义,因为表中的每个记录都有一个article属性(特别是因为没有不明确的0000文章)。

最佳答案

连接条件s1.price < s2.price意味着每个s1行将与价格较高的每个s2行连接。
这意味着对于表中价格最高(19.95)的行,行将匹配。因为它在外部联接中,所以无论如何都会返回不匹配的s1行,但所有s2列都将设置为s1
然后s2将丢弃除该行之外的所有行。你可能会发现在这个阶段之前检查结果是很有用的

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.25null行与6where s2.article is null行连接,10.99行与1连接,19.95行完全没有连接。
请注意,不能保证只返回一行,如果多行以最高价格绑定,则将返回所有行。

关于mysql - 如何使用JOIN对表格进行排序?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41080935/

10-13 05:25