行排名查询在MySQL中有效但在PHP

时间:2018-05-30 15:22:31

标签: php mysql

我已经查看过十几篇关于不使用PHP的查询的帖子,但他们都无法解决我的问题 - 希望这很简单!

我在这里尝试做的是" rank"这些行基于他们的年度总销售量,到目前为止工作得很好。当我在MySQL中运行我的查询时,它运行正常 - 我得到了数百个结果。

SET @row_number := 0;
SELECT @row_number := @row_number + 1 AS row_number, 
        TotalRevenue, 
        CompanyID
        FROM (
                SELECT CompanyID, 
                SUM(Sales_Amt) AS TotalRevenue 
                FROM Sales, 
                (SELECT @row_number := 0) r 
                GROUP BY CompanyID 
            ) t 
        WHERE TotalRevenue > 0 
        ORDER BY TotalRevenue DESC

产地:

row_number | TotalRevenue | CompanyID
-----------+--------------+----------
         1 |     81130.00 |       333
         2 |     72234.00 |       876
         3 |     62653.00 |       123
         4 |     54408.40 |       999
         5 |     44548.00 |       111

然而,当我通过PHP运行它时,我收回错误:

您的SQL语法出错;检查与您的MySQL服务器版本相对应的手册,以便在' SELECT @row_number:= @row_number + 1 AS row_number附近使用正确的语法,             TotalRevenue'在第2行

根据此处的其他帖子,我尝试过:

  • 在我的列名称周围添加``
  • 添加''围绕我的专栏名称
  • 在我创建@row_number
  • 时添加:=而不是=
  • 确认在我的PHP查询后添加了所有空格,以便关键词不会挤压在一起
  • 将我的mysqli-> charset设置为utf-8

这是我的PHP代码,如果你也需要它:

$query = "SET @row_number := 0; 
        SELECT @row_number := @row_number + 1 AS `row_number`, 
        TotalRevenue, 
        CompanyID 
        FROM ( 
                SELECT CompanyID, 
                SUM(`Sales_Amt`) AS TotalRevenue 
                FROM Sales 
                GROUP BY CompanyID 
            ) t 
        WHERE TotalRevenue > 0 
        ORDER BY TotalRevenue DESC";


if (!$result = $mysqli->query($query))
{
    print_r($mysqli->error);
}

希望这会非常简单,我只是没有看到。

谢谢!

1 个答案:

答案 0 :(得分:0)

除了S. Dev的答案之外,要添加其他选项,您可以使用mysqli multi query;

$query = "SET @row_number := 0; 
        SELECT @row_number := @row_number + 1 AS `row_number`, 
        TotalRevenue, 
        CompanyID 
        FROM ( 
                SELECT CompanyID, 
                SUM(`Sales_Amt`) AS TotalRevenue 
                FROM Sales 
                GROUP BY CompanyID 
            ) t 
        WHERE TotalRevenue > 0 
        ORDER BY TotalRevenue DESC";


if (!$result = $mysqli->multi_query($query))
{
    print_r($mysqli->error);
}

这将允许您一次预先形成多个查询,并将其全部保存在查询的相同范围内

它也使用稍微减少的开销,因为你只进行(技术上)1个查询,因为只有1个连接而不是2个单独的调用

值得查看存储过程以使其不必设置变量,而是将它们传递给查询本身