php - 使用 MIN() 为每个代码仅选择一条记录 (MySQL)

标签 php mysql

[强制症前言-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 。我知道在第二种和第三种方法中,我将查询嵌套到查询中,但我不明白为什么它们不起作用。

最佳答案

您已经接近第二次尝试了。但您应该加入的唯一列是 codeprice。然后,weightweave 来自此连接条件选择的行。

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/

相关文章:

mysql - 是否可以组合这 2 个查询来取回 2 个结果集?

php - 我如何使用 Ajax 和 Jquery 从 PHP 数据库中提取信息,并用该信息填充元素?

php - 在 PHP 中写入 STDERR 的内容去哪里了?

php - Connection.php 行 647 : SQLSTATE[42000]: Syntax error or access violation 中的 Laravel QueryException

mysql - 无法在 MySQL 语法错误中运行查询意外

php - 如何将sql查询结果放入数组?

php - wp_list_bookmarks 的布局

php - 超时在 PHP Httpful 请求中不起作用

mysql - 在两个不同的组中使用 ORDER BY 的 SQL 查询

mysql - select_full_join数量不断增加