You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL按SKU和日期分组查询最低价格并在PHP输出的问题

解决按日期+SKU分组获取最低价格记录的问题

我来帮你搞定这个需求!你想要的是按日期分组,再在每个日期下按SKU分组,找出每个SKU当天最低价格对应的完整记录对吧?你的原SQL语句有语法错误,而且逻辑没覆盖到「日期+SKU」的双重分组维度,所以没法得到正确结果。

问题分析

原SQL的核心问题:

  • 子查询未闭合括号,语法不合法
  • 仅按sku分组,没有关联date维度,无法区分不同日期下同一个SKU的最低价格
  • 子查询里的ORDER BY完全多余,分组后的排序不影响最终关联结果

正确的SQL语句

我们需要先通过子查询算出每个日期+SKU组合的最低价格,再关联原表获取对应的完整记录:

SELECT p.*
FROM products p
INNER JOIN (
    -- 子查询:按日期和SKU分组,得到每个组合的最低价格
    SELECT date, sku, MIN(total_price) AS min_price
    FROM products
    GROUP BY date, sku
) AS min_prices 
    ON p.date = min_prices.date 
    AND p.sku = min_prices.sku 
    AND p.total_price = min_prices.min_price
-- 按日期倒序、SKU排序,方便查看最新数据
ORDER BY p.date DESC, p.sku;

这个SQL的逻辑是:

  1. 子查询先对date和sku做双重分组,计算每个分组的最低价格min_price
  2. 将原表products和子查询结果关联,匹配日期、SKU和价格,就能拿到每个日期下每个SKU最低价格对应的那条(或多条,如果有多个商家同天同SKU价格相同且最低)记录

完整PHP代码示例

下面是可以直接运行的PHP代码,包含安全的输出处理(用htmlspecialchars()防止XSS攻击):

<?php
// 假设你已经通过mysqli建立了有效的数据库连接$conn
// 示例连接代码:
// $conn = new mysqli("localhost", "username", "password", "database_name");

$sql = "SELECT p.*
        FROM products p
        INNER JOIN (
            SELECT date, sku, MIN(total_price) AS min_price
            FROM products
            GROUP BY date, sku
        ) AS min_prices 
            ON p.date = min_prices.date 
            AND p.sku = min_prices.sku 
            AND p.total_price = min_prices.min_price
        ORDER BY p.date DESC, p.sku";

$result = $conn->query($sql);

// 输出HTML表格
echo "<table border='1' cellpadding='8' cellspacing='0'>";
// 表头
echo "<tr style='background-color: #f0f0f0;'>
        <th>ID</th>
        <th>SKU</th>
        <th>COMPANY</th>
        <th>TOTAL_PRICE</th>
        <th>DATE</th>
      </tr>";

// 遍历结果输出数据行
if ($result->num_rows > 0) {
    while($row = $result->fetch_assoc()) {
        echo "<tr>";
        echo "<td>" . htmlspecialchars($row['ID']) . "</td>";
        echo "<td>" . htmlspecialchars($row['sku']) . "</td>";
        echo "<td>" . htmlspecialchars($row['company']) . "</td>";
        echo "<td>" . htmlspecialchars($row['total_price']) . "</td>";
        echo "<td>" . htmlspecialchars($row['date']) . "</td>";
        echo "</tr>";
    }
} else {
    echo "<tr><td colspan='5'>暂无数据</td></tr>";
}

echo "</table>";

// 关闭连接
$conn->close();
?>

运行这段代码后,就能得到你想要的格式结果,比如2019/04/09当天的记录:

ID | SKU | COMPANY | TOTAL_PRICE | DATE

3 |tku1 | company_3 | 290.00 |2019/04/09
6 |stp1 | company_3 | 150.99 |2019/04/09
9 |upk1 | company_3 | 346.00 |2019/04/09
12 |dhu1 | company_2 | 515.99 |2019/04/09

内容的提问来源于stack exchange,提问作者infobuster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:14:25