如何使用PHP和MySQL实现单表分组查询及汇总统计?
解决单表多查询:提取唯一Ticket并统计总计
看起来你需要的是提取每个唯一的ticket及其对应金额,同时统计唯一ticket的数量和它们的金额总和对吧?你之前尝试了DISTINCT和UNION没达到预期,大概率是没结合子查询或分组来处理总计部分,咱们一步步来搞定。
第一步:MySQL查询构造
首先,咱们可以用一个查询结合UNION ALL同时获取明细数据和统计数据,避免多次数据库请求:
-- 获取每个唯一ticket及其对应金额(明细) SELECT ticket, amount, 'detail' AS result_type FROM (SELECT DISTINCT ticket, amount FROM your_table) AS ticket_details -- 追加唯一ticket总数统计 UNION ALL SELECT 'total tickets' AS ticket, COUNT(DISTINCT ticket) AS amount, 'summary' AS result_type FROM your_table -- 追加总金额统计(注意是唯一ticket的金额之和,不是所有行的总和) UNION ALL SELECT 'total_amount' AS ticket, SUM(amount) AS amount, 'summary' AS result_type FROM (SELECT DISTINCT ticket, amount FROM your_table) AS ticket_details;
关键说明:
SELECT DISTINCT ticket, amount刚好能提取每个唯一的ticket和它对应的金额(因为你的数据里同一个ticket的金额都是一致的,这会直接得到你要的前四行结果)。- 统计总金额时,我们先通过子查询拿到唯一的ticket-金额对,再SUM它们的amount,这样得到的就是5+10+5+5=25,而不是所有行金额的总和(那会是60)。
第二步:PHP处理结果
接下来用PHP连接数据库并处理查询结果,这里用PDO示例(比传统mysql_*函数更安全可靠):
<?php // 数据库连接配置 $dbHost = '你的数据库地址'; $dbName = '你的数据库名'; $dbUser = '你的用户名'; $dbPass = '你的密码'; try { // 初始化PDO连接 $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4", $dbUser, $dbPass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // 执行上述查询 $sql = " SELECT ticket, amount, 'detail' AS result_type FROM (SELECT DISTINCT ticket, amount FROM your_table) AS ticket_details UNION ALL SELECT 'total tickets' AS ticket, COUNT(DISTINCT ticket) AS amount, 'summary' AS result_type FROM your_table UNION ALL SELECT 'total_amount' AS ticket, SUM(amount) AS amount, 'summary' AS result_type FROM (SELECT DISTINCT ticket, amount FROM your_table) AS ticket_details; "; $stmt = $pdo->prepare($sql); $stmt->execute(); $results = $stmt->fetchAll(PDO::FETCH_ASSOC); // 遍历输出结果 foreach ($results as $row) { echo "{$row['ticket']} -> {$row['amount']}\n"; } } catch(PDOException $e) { echo "数据库错误: " . $e->getMessage(); } ?>
运行这段代码后,就会输出你期望的结果:
1357 -> 5 1356 -> 10 1355 -> 5 1354 -> 5 total tickets -> 4 total_amount -> 25
为什么之前的尝试没生效?
- 单独用
DISTINCT只能拿到明细数据,但没法直接得到总计; - 如果直接用
UNION拼接统计语句,可能没正确处理总金额的计算逻辑(比如直接SUM所有行的amount会得到错误的60,而不是25)。
内容的提问来源于stack exchange,提问作者Billys M
相关产品推荐
相关产品推荐

