2012-04-25 34 views
2

私はこのクエリをある程度機能させています。 'rating'の正しい値が返されます(最高の評価として7と出力されます)が、 'content'の出力はテーブルの別の行からのものです。 (最高ランクの行ではなく、7です)SQL MAX関数が正しく機能しないのはなぜですか?

$bestAnswerQuery = MYSQL_QUERY("SELECT content, MAX(rating) as rating FROM answers WHERE questionID = '$questionID'"); 

$fetchBestAnswer = MYSQL_FETCH_ASSOC($bestAnswerQuery); 

echo "$fetchBestAnswer[content] $fetchBestAnswer[rating]"; 

誰でも私にその理由を教えてもらえますか?私は検索したが、なぜこれが適切に動作していないのか分からない。

+0

」を特定の質問に対して最高の評価とその評価を持つコンテンツを取得しようとしていますか? –

+0

私は、集約関数をどのように処理するかを正確には知らなかったと思います。私は彼らがGROUP BY句を持っていなければならないことを知らなかった。 ありがとう –

答えて

8

これは、SQLでMAX仕事のように集約する方法ではありません。あなたの混乱は、集約のMySQLの(デフォルトの)非ANSI処理から来ています。

MAXのような集約は、グループを操作します。 group by句がない場合、結果セット全体が1つのグループとみなされます。 group by句の一部である式のみが、集約に囲まれずにselect句に含めることができます。 group byがない場合は、select句のすべての列または式を集約に含める必要があります。

しかし、MySQLのデフォルト設定では、グループ化されていない式をselect句に含めることができますが、指定された式がその値を取得するために使用する行は未定義です。グループ内のどの行でもかまいません。その長いったらしい答えた後

、何を取得したいことは与えられた問題のためにテーブルから最大ratingと関連するcontent列であれば、あなたはこの行うことができますので、あなたを

select 
    rating, 
    content 

from answers 

where questionID = '$questionID' 

order by rating desc 

limit 1; 
+0

ありがとうございました。私は、評価を降順で注文し、それを制限することについても考えなかった。 –

0

の変更はほとんどこのようなクエリ:

$bestAnswerQuery = mysql_query("SELECT content, rating as rating 
      FROM answers 
      WHERE questionID = '$questionID' 
      AND rating = MAX(rating)"); 
+2

これは、特定の質問の2つの回答が同じ最大定格を持つイベントで複数の行を返します。 –

+0

@AdamRobinsonとOPは単一行だけをエコーし​​ているので、どのように結果に影響を与えますか? – hjpotter92

+3

真実ですが、プレゼンテーションが変更された場合に驚きがないように、OPがクエリを適切に構造化する方法を知っていることが重要だと思います。 –

関連する問題