質問

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;

手順:

  1. 最初のステートメントで、@ count変数に実際に取得した結果の数を入れます
  2. 2番目のステートメントで、変数が不均等である場合、変数を1つ減らします
  3. クエリと制限のためのプレースホルダーを使用してステートメントを準備する
  4. 赤ちゃんを殺す
  5. 割り当て解除、これが必要かどうかわからない

しかし、これは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番目の行が最初の行をキャンセルし、最初の行を表示しません。これで両方の結果が表示されます。素敵なシンプルなソリューション、ところで。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top