MySQL - 使用JOIN从表中选择最低值

时间:2017-11-04 17:06:20

标签: mysql join left-join

以下查询从products表中选择每个产品系列中的最低价格产品:

SELECT 
    a.productline, a.productCode, a.productName, a.buyprice
FROM
    products a
        LEFT JOIN
    products b ON a.productline = b.productline
        AND b.buyprice < a.buyprice
WHERE
    b.productcode IS NULL;

您可以找到代码here。用于测试代码的在线编辑器是here

我无法理解来自表productLine的给定a的查询如何找到最低buyPrice。对于具有特定a的{​​{1}}中的某一行,表productLine中可能有多行。 1)那么如何选择最低的一个? 2)b b.productcode NULL如何与表ab相同?

1 个答案:

答案 0 :(得分:0)

如果您要在该网站上运行此查询:

| productline  |             productName             | buyprice | buyprice |             productName             |
|--------------|-------------------------------------|----------|----------|-------------------------------------|
| Classic Cars | 1958 Chevy Corvette Limited Edition |    15.91 | (null)   | (null)                              |
| Classic Cars | 1982 Lamborghini Diablo             |    16.24 | 15.91    | 1958 Chevy Corvette Limited Edition |
| Classic Cars | 1966 Shelby Cobra 427 S/C           |    29.18 | 15.91    | 1958 Chevy Corvette Limited Edition |
| Classic Cars | 1970 Plymouth Hemi Cuda             |    31.92 | 15.91    | 1958 Chevy Corvette Limited Edition |
| Classic Cars | 1961 Chevrolet Impala               |    32.33 | 15.91    | 1958 Chevy Corvette Limited Edition |

你得到这个结果:

a.productline = b.productline

所以,如果你看最右边的栏目,你会看到“1958年雪佛兰克尔维特限量版”重复多次。这是因为

  1. 将产品表与自身进行比较(这称为“自我加入”
  2. 加入条件b表示“经典汽车”与“经典汽车”匹配(以及每个产品线价值等),因此来自{{1}的所有“经典汽车”与a中的 EACH “经典汽车”进行比较(,顺便说一下,你会得到很多很多行)。
  3. 然后,将 a.buyprice b.buyrice 进行比较, b.buyprice 必须小于 a.buyprice 。然而,最便宜的汽车(15.91美元)不能有一个小于最便宜价格的匹配行,因此LEFT JOIN允许不匹配的行包含在结果中,所有b列都是NULL那个最便宜的车排。
  4. 然后where clause删除b.productcode有任何值的所有行(因为这些行找不到最便宜的a.buyprice)
  5. 因此,当b中的任何列为空时,只列出最便宜(最低)的价格

    | productline  |             productName             | buyprice | buyprice |             productName             |
    |--------------|-------------------------------------|----------|----------|-------------------------------------|
    | Classic Cars | 1958 Chevy Corvette Limited Edition |    15.91 | (null)   | (null)                              |