php - mysql_fetch_assoc 查询中的 COUNT、IF

标签 php mysql sql join count

我最近接管了一个网站,其中的一些 SQL 查询似乎有点超出我的能力范围。查询要做的就是找到属于用户的交易,然后找到附加到该交易的反馈分数(1,2 或 3)。它应该计算所有评级(1 为负面,2 为中立,3 为正面)供我稍后使用。代码如下:

$user = mysql_fetch_assoc($this->db_query('
            SELECT
                `UserAccess`.*,
                COUNT(IF(`Feedback`.`rating`=1, 1, NULL)) AS "negative",
                COUNT(IF(`Feedback`.`rating`=2, 1, NULL)) AS "neutral",
                COUNT(IF(`Feedback`.`rating`=3, 1, NULL)) AS "positive"
            FROM
                `UserAccess`
            LEFT JOIN
                `Trades`
            ON
                `Trades`.`owner` = `UserAccess`.`ID`
            LEFT JOIN
                `Feedback`
            ON
                `Feedback`.`trade` = `Trades`.`ID`
            WHERE
                `UserAccess`.`ID` = "'.$_COOKIE[Auth::$config['cookie_name_id']].'"
            GROUP BY
                `UserAccess`.`ID`
            LIMIT
                1
        '));

我的想法是,我可以使用这些数字来计算总体评分,使用 user['negative']user['positive'] 等。

这对我来说涉及到很多关于 sql 的新概念,所以我很难确定错误。我认为老开发人员对我使用的是早期版本的 PHP,这也可能是相关的(因此它可能对他来说工作正常)。

谢谢

最佳答案

您想要SUM() ,不是COUNT() :

$user = mysql_fetch_assoc($this->db_query('
        SELECT
            `UserAccess`.*,
            SUM(IF(`Feedback`.`rating`=1, 1, 0)) AS "negative",
            SUM(IF(`Feedback`.`rating`=2, 1, 0)) AS "neutral",
            SUM(IF(`Feedback`.`rating`=3, 1, 0)) AS "positive"
        FROM
            `UserAccess`
        LEFT JOIN
            `Trades`
        ON
            `Trades`.`owner` = `UserAccess`.`ID`
        LEFT JOIN
            `Feedback`
        ON
            `Feedback`.`trade` = `Trades`.`ID`
        WHERE
            `UserAccess`.`ID` = "'.$_COOKIE[Auth::$config['cookie_name_id']].'"
        GROUP BY
            `UserAccess`.`ID`
        LIMIT
            1
    '));

此外,don't use mysql_* functions; use MySQLi or PDO .

此外,从您的评论来看,您似乎滥用了 AS -- AS修改其后面的任何内容。所以,如果你把它放在 SUM() 之后,如SUM(IF(<code>Feedback</code>.<code>rating</code>=1, 1, 0)) AS "negative" ,然后您可以通过名称 negative 访问该伪列。如果将其放在之后,则可以在查询中的其他位置通过该别名引用该表。

请注意,如果没有与您的 WHERE 匹配的行子句,您将得到一个空结果集(因此数组 $user 将不包含任何内容)。

最后,请注意,您的代码目前容易受到 SQL 注入(inject)的攻击,因为 cookie 值可能会被伪造。您应该使用准备好的语句来防止这种情况。

关于php - mysql_fetch_assoc 查询中的 COUNT、IF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20417814/

相关文章:

php - 在 PHP 中的一个循环中从不同的行中多次获取

php - MySQL if 存在语法

php - 在以 PHP 运行的 MySQL 文件中使用 PHP session 变量?

python - Dockerfile 使用 python 和 mysql 创建镜像

kubernetes 上的 MYSQL HA (vmware)

sql - 调用返回 refcursor 的函数

php - 使用 PHP 进行 XML 分页

php - 在INSERT INTO MySQL查询中插入PHP变量

php - Laravel ORM 获取每一行的频率并将其重新插入表中

php - 这是从 mysql 获取单个值的有效查询吗?