将SUM(tbl_column)与$ print一起使用时未定义的常量

时间:2019-05-06 18:42:07

标签: php mysql

我正在使用 SUM 参数查询数据库,以汇总数据库表中的一列。因此,例如,在不使用 SUM 参数的情况下,我得到以下信息:

UserID | Name   | Email            | points
-------+--------+------------------+-------
1      | name 1 | email1@email.com | 5
1      | name 1 | email1@email.com | 8
1      | name 1 | email1@email.com | 2
2      | name 2 | email2@email.com | 8
2      | name 2 | email2@email.com | 8
3      | name 3 | email3@email.com | 3
4      | name 4 | email4@email.com | 9

以上代码中使用的SQL语句:

SELECT * 
FROM db_tbl 
ORDER BY points DESC

我想要实现的是:

  1. 消除表中的重复用户。
  2. 统计积分列,并向用户显示组合的积分。

示例

UserID | Name   | Email            | points
-------+--------+------------------+-------
1      | name 1 | email1@email.com | 15
2      | name 2 | email2@email.com | 16
3      | name 3 | email3@email.com | 3
4      | name 4 | email4@email.com | 9

正在测试的SQL语句:

SELECT user_id, name, email, SUM(points) 
FROM db_tbl 
ORDER BY points DESC

我遇到的问题是,当我将SQL语句更改为使用SUM时,它会生成

  

警告:在第27行使用未定义的常数点-假定为“点”(这将在以后的PHP版本中引发错误)

此查询示例还用单词 points 替换了点int。

我仍在学习PHP,并在下面发布了完整的代码以供参考。

function ctlTopUsers() {

global $wpdb;

$result = $wpdb->get_results ( "SELECT user_id, name, email, SUM(points) FROM db_tbl order by points DESC" ); 

foreach ( $result as $print )   {
    echo '<table border="1">';
    echo '<tr>';
    echo '<th>Name</th>';
    echo '<th>Email</th>';
    echo '<th>Points</th>';
    echo '</tr>';
    echo '<tr>';
    echo '<td>' . $print->name.'</td>';
    echo '<td>' . $print->email.'</td>';
    echo '<td>' . $print->points.'</td>';
    echo '</tr>';
    echo '</table>';
    }
}   

与第27行有关的错误可能是这些点的回波。

谢谢!

3 个答案:

答案 0 :(得分:4)

您将需要在SUM列中添加一个别名,以获得名称points ...

$result = $wpdb->get_results ( "SELECT user_id, name, email, SUM(points) as points FROM db_tbl order by points DESC" ); 

您可能会发现名称类似于SUM(points),但添加别名会更容易。

答案 1 :(得分:3)

您的查询有几个问题:

  

从db_tbl中按DESC点顺序选择user_id,名称,电子邮件,SUM(点)

  1. 表中不存在列/表达式points。您可能想订购为:order by SUM(points) DESC。您看到区别了吗?

  2. 您正在对行进行分组(使用SUM()),却忘记了使用GROUP BY子句指定要对哪些列进行分组。

总而言之,您的“合法”查询应为:

SELECT user_id, name, email, SUM(points)
FROM db_tbl 
GROUP BY user_id, name, email -- added GROUP BY
ORDER BY SUM(points) DESC -- uses an existing expression

MySQL对正确的语法非常宽容,并且允许您以不完整的方式编写查询。我建议使用正确的(完整的)表格,因为那是适用于大多数数据库的表格。

答案 2 :(得分:0)

您可以使用此查询

SELECT `UserID`, `Name`, `Email`,SUM(`points`) As total 
FROM `data` GROUP BY `UserID` ORDER BY SUM(`points`) DESC

LIVE DEMO