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」テーブルのサーバーが「servers」テーブルの ID と同じである「reviews」テーブルから平均フィールドを取得することを意図しています。

私が言ったように、このクエリは以前は正常に機能していました。昨日、サイトの重要な部分が機能していないことに気付き、このクエリが失敗していることに気付きました。

が正確に 1 行を返すことを確認しました (「servers」テーブルには 4 つのエントリがあるため、現時点では 4 を返すはずです)。

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 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

GROUPBY関数の詳細。

- アップデート -

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 に答える