MySQL クエリを偶数の結果に制限する
質問
MySQL データベースから偶数の結果を返す必要がある少しの PHP コードがあります。mysqli 拡張機能を使用してクエリを実行しています。
現時点での私のコードはほぼこれです:
//assume we already have a database connection
$query = "SELECT id
FROM movies
WHERE publish = 1
AND showimage = 1
ORDER BY date DESC
LIMIT 6";
$result = $connection->query($query);
while ($row = $result->fetch_assoc()) {
//do some stuff
}
ご覧のとおり、クエリを 6 行に制限していますが、条件によっては返される行数が少なくなります。3 行だけが返された場合は、最後の行を破棄して 2 行だけを保持したいと思います。
MySQL クエリまたは MySQLi でこれを行うにはどうすればよいですか?
解決
次のようなものを想像します:
// row counter
$counter = 1;
// loop through each row
while($row = $result->fetch_assoc()) {
// If there is more than one row remaining
// OR if the current row can be divided by two
if (($result->num_rows - $counter) > 1 || ($counter % 2)) {
// result code for even rows
$counter++;
} else {
// break out of the loop
break;
}
}
他のヒント
おそらくSQLではなくPHPでこれを行うでしょう。 while
ループでは、カウンターを保持し、ループを抜けたらカウンターを確認します。奇妙な場合は、最後の反復の結果を破棄します。
別のオプションはCOUNT
を要求し、結果に応じてクエリを変更します:
SELECT COUNT(*) FROM movies WHERE publish = 1 AND showimage = 1
私はPHPの人ではありません(私が調べてから何年も経ちましたが)。...
Rossが言及していますが、使用したい
$result->num_rows
結果を処理して偶数行を保持するループ内で何らかの方法で。
$maxResults = $result->num_rows;if(($ maxresults%2)= 1)$ maxresults-;
counter が $maxResults と同じになった場合、ループを抜けます。
私の答えはmysqlのみです。おそらく最良ではないかもしれませんが、多分ちょっとクールです。 :-)
SELECT size INTO @count FROM (SELECT COUNT(*) as size FROM (SELECT * FROM table LIMIT 6) l) t;
SET @count = @count - (@count % 2);
PREPARE stmt_limit FROM 'SELECT * FROM table LIMIT ?';
EXECUTE stmt_limit USING @count;
DEALLOCATE PREPARE stmt_limit;
手順:
- 最初のステートメントで、@ count変数に実際に取得した結果の数を入れます
- 2番目のステートメントで、変数が不均等である場合、変数を1つ減らします
- クエリと制限のためのプレースホルダーを使用してステートメントを準備する
- 赤ちゃんを殺す
- 割り当て解除、これが必要かどうかわからない
しかし、これはPHPソリューションよりも速いかもしれません...
最も簡単な方法は、一度に2行ずつ取得することです。
while($row1 = $result->fetch_assoc() && $row2 = $result->fetch_assoc()) {
do_something_with($row1);
do_something_with($row2);
}
(PHPの人ではありませんが、他の回答から構文を積んでいます...)
シャーキー、
ソリューションは完全に機能しますが、構文を少し変更する必要があります。以下を参照してください。
while(($row1 = $result->fetch_assoc()) && ($row2 = $result->fetch_assoc()))
{
do_something_with($row1);
do_something_with($row2);
}
別の方法では、2番目の行が最初の行をキャンセルし、最初の行を表示しません。これで両方の結果が表示されます。素敵なシンプルなソリューション、ところで。