[强制症前言-1]我知道这个问题至少已经被回答了十亿次,但问题是我无法将这些答案建模为我想要获得的内容。我不是 SQL 专家,这是肯定的;我对 SELECT、UPDATE、DELETE、ecc 等经典命令很有信心。所以我要感谢任何愿意帮助我的人。
也就是说,假设我有一张这样的 table :
|----|--------|------------|----|----------|---------|---------|------|
| id | code | category | mq | weight | weave | price | show |
|----|--------|------------|----|----------|---------|---------|------|
| 1 | DT450R | carbon | 1 | 450 | plain | 90 | 1 |
| 2 | DT450R | carbon | 2 | 450 | plain | 40 | 1 |
| 3 | DT450R | carbon | 5 | 450 | plain | 75 | 1 |
| 4 | ZX300R | carbon | 1 | 300 | plain | 12 | 0 |
| 5 | ZX300R | carbon | 15 | 300 | plain | 128 | 1 |
| 6 | ZX300R | carbon | 30 | 300 | plain | 92 | 1 |
| 7 | PP120Q | carbon | 3 | 120 | twill | 28 | 1 |
| 8 | PP120Q | carbon | 7 | 120 | twill | 65 | 1 |
| 9 | PP120Q | carbon | 9 | 120 | twill | 49 | 1 |
我希望查询做的是为每个代码选择仅具有最低价格的行:
| 2 | DT450R | carbon | 2 | 450 | plain | 40 | 1 |
| 4 | ZX300R | carbon | 1 | 300 | plain | 12 | 0 |
| 7 | PP120Q | carbon | 3 | 120 | twill | 28 | 1 |
第一次尝试(基于 MySQL documentation 中给出的 MIN() 的解释,或者至少基于我的理解它):
$sql = 'SELECT code, weight, weave, MIN(price)
FROM products
WHERE category="carbon" AND show="1"
GROUP BY code
ORDER BY weight ASC';
第二次尝试(基于 this answer 此处):
$sql = 'SELECT a.code, a.weight, a.price, a.weave
FROM products a
INNER JOIN
(
SELECT code, weight, MIN(price) AS minprice, weave
FROM products
GROUP BY code
)
b ON a.code = b.code AND a.weave = b.weave AND a.price = b.minprice AND AND a.weight = b.weight
WHERE category="carbon" AND show="1"
ORDER BY a.weight ASC';
第三次尝试(基于 this other answer 此处):
$sql = 'SELECT code, weight, weave, price
FROM products
INNER JOIN
(
SELECT MIN(price) price, code, weight, weave
FROM products
GROUP BY code
)
AS MIN ON MIN.code = products.code AND MIN.weight = products.weight AND MIN.weave = products.weave
WHERE category="carbon" AND show="1"
ORDER BY a.weight ASC';
说这些尝试都没有产生预期的结果可能是没有用的;只有第三个方法输出一些内容,而其他两个方法返回 0 matches
。我知道在第二种和第三种方法中,我将查询嵌套到查询中,但我不明白为什么它们不起作用。
最佳答案
您已经接近第二次尝试了。但您应该加入的唯一列是 code
和 price
。然后,weight
和 weave
来自此连接条件选择的行。
SELECT a.code, a.weight, a.price, a.weave
FROM products a
INNER JOIN
(
SELECT code, MIN(price) AS minprice
FROM products
GROUP BY code
)
b ON a.code = b.code AND a.price = b.minprice
WHERE category="carbon" AND show="1"
ORDER BY a.weight ASC
这与您链接到的问题中的答案相同。他们都不建议将其他列添加到 ON
子句中,所以我不确定它来自哪里。
关于php - 使用 MIN() 为每个代码仅选择一条记录 (MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41511797/