2

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でこれを行うにはどうすればよいですか?

4

8 に答える 8

5

SQL ではなく、おそらく PHP でこれを行うでしょう。ループ内ではカウンターを保持し、whileループを抜けたらカウンターかどうかを確認します。奇数の場合は、最後の反復の結果を破棄します。

于 2009-01-17T12:32:21.417 に答える
5

私は次のようなものを想像します:

// 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;
    }
}
于 2009-01-17T12:43:47.853 に答える
4

別のオプションはCOUNT、結果に従ってクエリを変更することです。

SELECT COUNT(*) FROM movie WHERE publish = 1 AND showimage = 1
于 2009-01-17T12:45:10.533 に答える
2

私はPHPの人ではありません(私がそれを見てから何年も経ちました)が....

ロスはそれについて言及していますが、あなたは使いたいです

$result->num_rows

結果を処理して偶数行を保持するループ内で何らかの方法で。

于 2009-01-17T13:01:26.100 に答える
2
$maxResults = $result->num_rows;
if( ($maxResults % 2) = 1)
    $maxResults--;

counter が と同じとき$maxResults、ループを抜けます。

于 2009-01-17T13:12:45.190 に答える
1

最も簡単な方法は、一度に 2 つの行を取得することです。

while($row1 = $result->fetch_assoc() && $row2 = $result->fetch_assoc()) {
    do_something_with($row1);
    do_something_with($row2);
}

(PHPの人ではありませんが、他の回答からの構文をカーゴカルトしています...)

于 2009-04-18T00:21:47.187 に答える
1

シャーキー、

ソリューションは完全に機能しますが、構文を少し変更する必要があります。下記参照。

while(($row1 = $result->fetch_assoc()) && ($row2 = $result->fetch_assoc()))
{ 
    do_something_with($row1); 
    do_something_with($row2); 
} 

他の方法では、2 行目は最初の行をキャンセルし、最初の行は表示されません。これで、両方の結果が表示されます。素敵なシンプルなソリューション、ところで。

于 2010-04-05T23:13:27.740 に答える
1

私の答えは 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. limit のクエリとプレースホルダーを使用してステートメントを準備する
  4. 赤ん坊を処刑する
  5. 割り当て解除、これが必要かどうかわからない

しかし、これはphpソリューションよりも速いかもしれません...

于 2009-01-17T14:24:46.323 に答える