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的逻辑是:
- 子查询先对
date和sku做双重分组,计算每个分组的最低价格min_price - 将原表
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
相关产品推荐
相关产品推荐

