0

我遇到了一个奇怪的问题,我一点也不知道它为什么不起作用。我构建了以下查询:

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 

几周前,此查询运行良好。它的目的是从“servers”表中获取许多字段,以及“reviews”表中的平均字段,其中“reviews”表中的服务器与“servers”表中的 id 相同。

就像我说的,这个查询以前工作得很好。昨天我注意到我网站的一个重要部分没有工作,我发现这个查询失败了。

我已经确认返回正好 1 行(此时它应该返回 4,因为“服务器”表中有 4 个条目。)这是 phpMyAdmin 在我执行该查询时给我的:

id    name  address  port   up    down  genre   score   version  country   review
NULL  NULL  NULL     NULL   NULL  NULL  NULL    NULL    NULL    NULL       NULL

有人可以启发我吗?我作为最后的手段来到这里,因为我被困住了。

4

1 回答 1

2

如评论中所述,尝试将其更改为INNER JOINLEFT 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函数的更多信息。

- 更新 -

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
于 2012-05-04T23:28:07.053 回答