0

PDO からの結果を表示するには、たとえば次の PHP コードを常に使用します。

$STH = $DBH->prepare("SELECT logo_id, guess_count, guessed, count(id) AS counter FROM guess WHERE user_id=:id");
$STH->bindParam(":id",$loginuser['id']);
$STH->execute();
while($row = $STH->fetch()){
    print_r($row);
}

問題は、結果が 1 つしか得られないことです。$STH->rowCount()以前は返された行の量をチェックするために使用してSELECTいましたが、一部のデータベースでは正しく反応しないため、この方法はステートメントにはあまりお勧めできません。そのため、 を使用しましたが、 の値が 1 より大きいcount(id) AS counterにもかかわらず、毎回 1 つの結果しか得られません。$row['counter']

1 つのクエリで結果の量をカウントする正しい方法は何ですか?

4

2 に答える 2

1

を使用する必要がありますGROUP BY。クエリは次のようになります

SELECT logo_id, guess_count, guessed, COUNT(id) AS counter 
  FROM guess 
 WHERE user_id=:id
 GROUP BY logo_id, guess_count, guessed
于 2013-07-26T22:05:08.007 に答える
1

クエリによって返される行数を確認する場合は、いくつかのオプションがあります。


->fetchAllすべての行の配列を取得するためにa を実行できます。(これは、大きな結果セット (つまり、クエリによって返される行数が多い) にはお勧めできません。クエリに LIMIT 句を追加して、一定数以上の行が返されないようにすることができます。複数の行を取得する場合は、2 つの行を取得するだけで済みます。) 配列の長さをチェックするのは簡単です。


別のオプションは、別の別のクエリを実行して、カウントを個別に取得することです。

SELECT COUNT(1) AS counter FROM guess WHERE user_id=:id

ただし、そのアプローチでは、データベースへの別のラウンド トリップが必要になります。


また、古いスタンバイSQL_CALC_ROUND_ROWSも別のオプションですが、これも大規模なセットではパフォーマンスに問題が生じる可能性があります。


既存のコードにループ カウンターを追加することもできます。

$i = 0;
while($row = $STH->fetch()){
  $i++
  print_r($row);
}
print "fetched row count: ".$i;

クエリを実行して行を返す前に、特定の述語を満たす行数の正確なカウントが必要な場合は、個別の COUNT(1) クエリが最も適切なアプローチである可能性があります。はい、アプリ内の余分なコードです。行を取得するクエリを実行する前に、一連の述語を満たす行の正確な数を取得するために、コードの目的を示すコメントをコードの前に付けることをお勧めします。

とにかく行を処理するLIMIT 0,100必要があり、クエリへの追加が許容される場合は、 を->fetchAll()選択し、配列の長さからカウントを取得し、配列から行を処理します。

于 2013-07-26T22:15:40.173 に答える