以下查询从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
如何与表a
和b
相同?
答案 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年雪佛兰克尔维特限量版”重复多次。这是因为
b
表示“经典汽车”与“经典汽车”匹配(以及每个产品线价值等),因此来自{{1}的所有“经典汽车”与a
中的 EACH “经典汽车”进行比较(,顺便说一下,你会得到很多很多行)。LEFT JOIN
允许不匹配的行包含在结果中,所有b
列都是NULL那个最便宜的车排。where clause
删除b.productcode
有任何值的所有行(因为这些行找不到最便宜的a.buyprice)因此,当b
中的任何列为空时,只列出最便宜(最低)的价格
| productline | productName | buyprice | buyprice | productName |
|--------------|-------------------------------------|----------|----------|-------------------------------------|
| Classic Cars | 1958 Chevy Corvette Limited Edition | 15.91 | (null) | (null) |