2

コード:

 $review = mysql_query("SELECT conceptID, MIN(nextReview) FROM userconcepts WHERE userID='$userID'");
 $nrows = mysql_num_rows($review);
 echo "$nrows<br />\n";

テーブルにそのようなエントリがあり、正しい列値を返す場合、クエリは機能します。ただし、HeidiSQL で確認できるように、テーブルが空の場合、mysql_num_rows は 1 を返しますが、列の値は空です。(テーブルに異なるユーザー ID の他の値がある場合、問題は依然として残ります)。

このクエリは、通常の操作中に空のセットを返すことがあると予想し、結果の存在に基づいてアクションを実行したいのですが、結果が存在する場合は結果も使用したいと考えています。このコードが期待どおりに機能しない理由はありますか (テーブルが空の場合は 0 を返すと予想されます)。

4

2 に答える 2

4

まず、クエリには非常に単純な問題があります。conceptIDフィールドを表示していますが、それによってグループ化していません。SELECT集計関数を使用するフィールドを表示したい場合は、それを表示する必要があります。そうしないとエラーになり、多くのエンジンでクエリが実行されなくなります。

それはさておき、集計関数があり、何もグループ化しない (つまり、GROUP BY句を追加しない) 場合は常に、結果は1行になります。テーブル内の行数に関係なく。

于 2013-03-03T23:46:52.713 に答える
0

その理由は、SQL エンジンが集計関数のみを使用してクエリを実行すると、1 行が返されるためです。そう:

select count(*)
from table
where 1 = 2

値 0 の 1 行を返します。これは、すべての SQL エンジンが動作する方法です。

あなたのクエリは少し異なります:

select conceptID, MIN(nextReview)
FROM userconcepts
WHERE userID='$userID'"

ほとんどの SQL ダイアレクトでは、from "conceptID not in group by clause" などのエラーが発生します。つまり、クエリに構文エラーが発生します。

MySQL はこれをサポートしています。nextReview(条件を満たす行から)の最小値と(同じ行から)whereの任意の値を返しconceptIDます。この場合、行がないため、値は に設定されNULLます。

おそらく、 ごとに 1 つの行が必要ですconceptId。そのクエリは次のようになります。

select conceptID, MIN(nextReview)
FROM userconcepts
WHERE userID='$userID'
group by conceptId
于 2013-03-03T23:58:29.383 に答える