COUNT,IF,在mysql_fetch_assoc查询中

时间:2013-12-06 06:49:59

标签: 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']等。

这对我来说有很多新的概念,因此我无法确定故障。我认为旧的开发人员使用早期版本的PHP(因此它可能对他来说可能正常工作)也可能是相关的。

由于

1 个答案:

答案 0 :(得分:2)

您需要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(Feedback.rating=1, 1, 0)) AS "negative"中一样,那么您可以通过名称Feedback访问该伪列。如果您将它放在之后,那么您可以通过查询中其他位置的别名来引用该表。

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

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