【问题标题】:COUNT, IF, in a mysql_fetch_assoc queryCOUNT,IF,在 mysql_fetch_assoc 查询中
【发布时间】:2013-12-06 06:49:59
【问题描述】:

我最近接管了一个站点,其中包含一些似乎有点超出我能力的 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 也可能是相关的(所以它可能对他来说工作正常)。

谢谢

【问题讨论】:

    标签: php mysql sql join count


    【解决方案1】:

    你想要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

    此外,从您的 cmets 看来,您似乎在滥用 AS -- AS 修改了后面的任何内容。所以,如果你把它放在SUM() 之后,就像SUM(IF(Feedback.rating=1, 1, 0)) AS "negative",那么你可以通过名字negative 访问那个伪列。如果你把它放在一个之后,那么你可以在查询的其他地方通过那个别名来引用那个表。

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

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

    【讨论】:

    • 感谢您的回复,不幸的是它对我不起作用。如果在查询之后,我使用 $user['positive'] = 2; 手动设置值,我的其余代码工作正常,所以它绝对是查询的一部分。据我所知,所有表名和列名也是正确的。啊!
    • 你能解释一下“它没有用”是什么意思吗?你得到了什么,你期待什么?
    • 您是否按照说明将 NULL 更改为 0?
    • 我完全复制到代码中。我希望我能够使用$user['positive']$user['negative'] 访问总和或计数。我怀疑问题可能出在这里,因为如果我将查询更改为像SELECT COUNT(rating) FROM Feedback AS positive 这样简单的查询,当我使用$user['positive'] 时,我仍然得到一个零。再次感谢您的帮助。
    • 也许我误解了“AS”部分。任何地方的数据库中都不存在正面、负面或中性。据我了解,它只是计算具有 IF 语句中指定的评级的行,然后将它们汇总到数组中称为“正”的部分。然后当我访问 $user['positive'] 时,它给了我那个数字。对吗?
    猜你喜欢
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2011-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-25
    相关资源
    最近更新 更多