我最近接管了一个网站,其中包含一些似乎有点超出我的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(因此它可能对他来说可能正常工作)也可能是相关的。
由于
答案 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值可能是伪造的。您应该使用预准备语句来防止这种情况。