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

如何对PHP输出的MySQL驱动HTML表格按月销售额降序排序?

解决PHP+MySQL生成表格按本月销售额排序的问题

你遇到的前端JS排序无效的问题很常见——因为表格内容是从数据库动态拉取的,每次页面刷新都会重新生成DOM,前端排序只能作用于当前页面的临时数据,没法从根源上解决排序需求。最优方案是在数据库查询阶段就完成排序,这样生成的表格直接就是按要求排列好的,而且性能也会比前端排序更好。

先分析你现有代码的问题

你的代码里每个在线坐席都要执行3次额外的查询(今日/本周/本月销售额),不仅效率低,而且完全没加入排序逻辑。我们可以重构SQL,一次性拉取所有需要的数据并完成排序。

优化后的完整代码

<?php
$counter = 1;
include_once 'config.php';

// 重构SQL:一次性获取坐席信息+各时段销售额,并按本月销售额降序排序
$sql = "SELECT 
            va.*,
            -- 今日销售额统计
            (SELECT COUNT(status) FROM vicidial_agent_log 
             WHERE user = va.user AND DATE(event_time) = CURDATE() AND status = 'SALE') AS sales_today,
            -- 本周销售额统计(避免跨年周问题)
            (SELECT COUNT(status) FROM vicidial_agent_log 
             WHERE user = va.user AND YEARWEEK(event_time, 1) = YEARWEEK(CURDATE(), 1) AND status = 'SALE') AS sales_week,
            -- 本月销售额统计
            (SELECT COUNT(status) FROM vicidial_agent_log 
             WHERE user = va.user AND MONTH(event_time) = MONTH(CURDATE()) AND YEAR(event_time) = YEAR(CURDATE()) AND status = 'SALE') AS sales_month
        FROM vicidial_live_agents va
        -- 核心:按本月销售额从高到低排序,相同则按本周销售额排序
        ORDER BY sales_month DESC, sales_week DESC";

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

while($row = $result->fetch_assoc()) {
    // 状态颜色逻辑保持不变,改用switch更简洁
    switch($row['status']) {
        case "INCALL":
            $colour = "w3-green";
            break;
        case "READY":
            $colour = "w3-yellow";
            break;
        case "PAUSED":
            $colour = "w3-grey";
            break;
        case "DEAD":
            $colour = "w3-red";
            break;
        default:
            $colour = "";
    }

    // 处理空值,确保没有销售额时显示0
    $sales_today = $row['sales_today'] ?? 0;
    $sales_week = $row['sales_week'] ?? 0;
    $sales_month = $row['sales_month'] ?? 0;

    // 输出表格行
    echo '<tr class="'.$colour.'">
            <td class="w3-xlarge">'.$counter.'</td>
            <td class="w3-xlarge">'.$row['user'].'</td>
            <td class="w3-xlarge">'.$sales_today.'</td>
            <td class="w3-xlarge">'.$sales_week.'</td>
            <td class="w3-xlarge">'.$sales_month.'</td>
          </tr>';
    
    $counter++;
}
?>

关键优化点说明

  1. 数据库层面排序:通过ORDER BY sales_month DESC直接让查询结果按本月销售额从高到低排列,生成的表格自然就是排序好的,完全不需要前端介入。如果需要更复杂的排序(比如本月销售额相同的按本周销售额排序),只需修改ORDER BY的条件即可。
  2. 减少数据库请求:原代码每个坐席要执行3次额外查询,现在只需要1次主查询,性能提升非常明显,尤其是在线坐席数量较多时。
  3. 修复跨年周问题:把原有的WEEK()判断改成YEARWEEK(event_time, 1),避免跨年时周统计出错(1表示周一为一周的第一天,可根据你的需求调整)。
  4. 代码更简洁:去掉了嵌套的while循环,逻辑更清晰,同时用?? 0处理空值,避免表格出现空白。

额外提醒:SQL注入风险

你的原代码中直接将$user拼到SQL语句里,虽然$user来自vicidial_live_agents表,但仍存在SQL注入风险。如果后续需要单独查询销售额,建议使用预处理语句:

$stmt = $conn->prepare("SELECT COUNT(status) AS sales FROM vicidial_agent_log WHERE user = ? AND DATE(event_time) = CURDATE() AND status = 'SALE'");
$stmt->bind_param("s", $user);
$stmt->execute();
$result = $stmt->get_result();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:58:10