【问题标题】:Row ranking query works in MySQL but not in PHP [duplicate]行排名查询在 MySQL 中有效,但在 PHP 中无效 [重复]
【发布时间】:2018-05-30 15:22:31
【问题描述】:

我查看了十几篇关于在 PHP 中无法使用的查询的帖子,但它们都无法解决我的问题 - 希望这是一个简单的问题!

我在这里尝试做的是根据年总销售额对行进行“排名”,到目前为止效果很好。当我在 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 附近使用正确的语法, 第 2 行的 TotalRevenue'

根据这里的其他帖子,我已经尝试过:

  • 在我的列名周围添加 ``
  • 在我的列名周围添加 ''
  • 在我创建 @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);
}

希望这将是一件非常简单的事情,我只是没有看到。

谢谢!

【问题讨论】:

标签: php mysql


【解决方案1】:

要在 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 个查询,因为只有 1 个连接而不是 2 个单独的调用

可能值得研究存储过程来制作它,这样您就不必设置变量,而是将它们传递给查询本身

【讨论】:

  • 谢谢山姆!你是完全正确的——我什至不知道 multi_query,这就是我所有问题的解决方案。我会投票赞成你的答案,并标记为已解决。
  • 如果这回答了您的问题,请考虑标记为已接受 :)
猜你喜欢
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
相关资源
最近更新 更多