2012-05-04 15 views
0

私は奇妙な問題を抱えています。なぜそれが機能していないのかについて少しは考えていません。 は私が構築し、次のクエリを持っている:MySQLクエリは以前は動作していましたが、今はそうではありませんか?

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"テーブルの平均フィールドを取得することを意味します。

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

「サーバ」テーブルに4つのエントリがあるため、現在のところ1行しか返されていないことを確認しました。 これは、実行時にphpMyAdminが私に与えるものですそのクエリ:

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

誰か私を啓発できますか?私は最後の手段としてここに来ました、なぜなら私は立ち往生しているからです。

+0

あなたがテーブルをチェックしていますか?バックエンドで何か問題が起きている可能性があります(テーブルにまだテーブルがあるかどうかを確認するためにワークベンチを使用します) –

+1

'select * from servers'クエリを実行して、データが欠落していないかどうかを確認してください。 SQLインジェクション攻撃の被害を受けた可能性があります。 –

+0

データが欠落していないことを100%確信しています.SQLインジェクションの機会をすべて無くしました。 'SELECT * FROM servers'は予想される行数を返しますが、この問合せではすべてのフィールドがNULLになります。 – fruitcup

答えて

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 

functions BY GROUPについての詳細情報。

- 更新 -

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

ありがとうございます、今は期待どおりに動作しています。私は今、いくつかの研究をやらなければならないだろう。再度、感謝します! – fruitcup

+0

それを聞いてうれしいです。がんばろう。 –

+0

こんにちは、マイク、私は悲しいことに、この解決策に問題があるので私は戻ってきました。私のテストのシナリオでは、 "サーバ"テーブルに2行、 "レビュー"テーブルに0行あります。そのクエリを使うと、私はサーバテーブルから1つの結果しか得られません。なぜ、正確にはわからない。私を助けようとしてもらえますか? – fruitcup

関連する問題