2016-12-10 32 views
1

我正在浏览mysql文档,并且在the common queries section之下,他们提到了如何使用LEFT JOIN获取表的最大列值。这里的表:如何使用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的语义。这句话,“从s2在声明s1.price < s2.price是真的选择所有行(如果是这样,那么W3学校上面的链接是不是真的为MySQL)?即LEFT JOINLEFT INNER JOIN

最后,WHERE s2.article IS NULL使得绝对没有任何意义,我因为在表中的每个记录有一个article属性(尤其是因为没有暧昧0000文章)。

+1

'where s2.article is null'意味着(假设该字段不为空),s1的详细信息将仅在没有高于表中的价格的项目中找到。 – TZHX

回答

2

的加盟条件s1.price < 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一行一个,和19.95一个没有。

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

+0

哦,这是天才。谢谢! – Rdesmond

相关问题