我遇到了一个奇怪的问题,我一点也不知道为什么它不起作用。 我有以下查询:
SELECT servers.id, servers.name, servers.address, servers.port, servers.up, servers.down, servers.genre, servers.score, servers.version, servers.country, ROUND( AVG( reviews.average ) , 0 ) AS review
FROM servers
INNER JOIN reviews ON servers.id = reviews.server
ORDER BY servers.score DESC
几个星期前,这个查询工作正常。它旨在从“服务器”表中获取许多字段,以及“评论”表中的平均字段,其中“评论”表中的服务器与“服务器”表中的ID相同。
就像我说的,此查询之前工作正常。昨天我注意到我网站的一个重要部分无法正常工作,我发现这个查询失败了。
我已经确认正在返回1行(此时,它应该返回4,因为“servers”表中有4个条目。) 这是我执行该查询时phpMyAdmin给我的:
id name address port up down genre score version country review
NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL
有人可以开导我吗?我作为最后的手段来到这里,因为我被困住了。
答案 0 :(得分:2)
正如评论中所述,尝试将INNER JOIN
更改为将返回服务器的LEFT OUTER JOIN
,无论评论表中是否存在匹配的行。此外,您没有发布架构,但请仔细检查评论表中的reviews.server
列,而不是server_id
。另一个问题是,您正在进行AVG
这是一个分组计算,但您没有GROUP BY
子句,因此我建议您添加它,因此您的完整查询应如下所示:
SELECT servers.id, servers.name, servers.address, servers.port, servers.up, servers.down, servers.genre, servers.score, servers.version, servers.country, ROUND( AVG( reviews.average ) , 0 ) AS review
FROM servers
LEFT OUTER JOIN reviews ON servers.id = reviews.server # might be reviews.server_id
GROUP BY reviews.server
ORDER BY servers.score DESC
有关GROUP BY functions的更多信息。
- 更新 -
SELECT servers.id, servers.name, servers.address, servers.port, servers.up, servers.down, servers.genre, servers.score, servers.version, servers.country, IFNULL(ROUND(AVG(reviews.average)), 0) AS review
FROM servers
LEFT OUTER JOIN reviews ON servers.id = reviews.server
GROUP BY servers.id
ORDER BY servers.score DESC