0

テーブル内のレコード数を取得してから 4 で割った後、結果に基づいて制限範囲を指定して SQL ステートメントを作成したいと考えています。たとえば、4 で割った 8 つのレコードを持つテーブルがあるとします。次のような制限範囲を持つ 2 つの SQL ステートメントを作成しますlimit 0,4limit 4,8

最終結果は次のようになります

Select * from prop where id=123 LIMIT 0,4

Select * from prop where id=123 LIMIT 4,8

私のアプローチは、作成されるSQLステートメントの数をカウントするforループを持つことでした。次に、ループ内: 最初の円0-4と 2 番目の円は4-8

limit 0-4とに苦労していますlimit 4-8

PHP スクリプト

include('connect.php');    
$query_1 = "Select COUNT(*) as Total from prop where ref = 'SB2004'";
$results_query_1 = mysql_query($query_1);
 while($row_query_1 = mysql_fetch_array($results_query_1))
 {
        $cnt = $row_query_1['Total'];
 }

 echo $cnt;
 echo "<br>";
 $num_grps = 0;
 if ($cnt % 4 == 0 )
 {
   echo $num_grps = $cnt / 4 ;

 }
$count_chk= $num_grps * 4;
 for ($i=1;$i<=$num_grps;$i++)
{
    //for loop for range
    for()
    {
        $range = '0,4';
        echo "SELECT prop_ref from prop limit".$range;
    }
}
4

1 に答える 1

0

問題を理解していないか、うまく説明できていないかのどちらかです。

ここで最も差し迫った問題は、LIMIT 句の構文を誤解していることです。最初の引数は開始するオフセットを指定し、2 番目の引数は返す行数を定義します。したがって、LIMIT 4,8 は 8 行を返します (データセットに 12 行以上あると仮定します)。

次の問題は、結果を再現可能にする必要があるかどうかをあなたが言っていないことです。たとえば、主キー 1 と 2 を持つ行がある場合、これらは常に同じクエリで返される必要があります。明示的な ORDER BY 句がない場合、クエリで見つかった順序に基づいて行が返されます。

次の問題は、行の総数が 4 の偶数倍でない最後のケースをどのように処理するかを説明していないことです。

あなたが提供したコードは行数を数えますwhere ref = 'SB2004'が、フィルタリングされていないクエリを作成します-なぜですか?

あなたが提供したコードは、クエリの制限を変更しません - なぜですか?

次の問題は、このようなループ内で SELECT クエリを実行する正当な理由がないことです。選択クエリで何をしようとしているのかを説明しませんでした。しかし、その後の更新に基づいて....

 include('connect.php');    
 $query_1 = "Select COUNT(*) as Total from prop where ref = 'SB2004'";
 $cnt = mysql_fetch_assoc(mysql_query($query_1));

 $blocks=$cnt['Total']/4 + (0 == $cnt['Total'] % 4 ? 0 : 1);

 $qry2="SELECT * FROM prop where ref='SB2004' ORDER BY primary_key";
 $res=mysql_fetch_assoc($qry2);

 for ($x=0; $x<$blocks; $x++) {
    print "<div>\n$block<br />\n";
    for ($y=0; $y<4; $y++) {
       print implode(",", @mysql_fetch_assoc($res)). "\n";
    }
    print "</div>\n";
 }

これをさらに改良して、データベースに対して 1 つのクエリのみを発行するのは簡単です。

本当に個々の SELECT を生成する必要がある場合は....

 include('connect.php');    
 $query_1 = "Select COUNT(*) as Total from prop where ref = 'SB2004'";
 $cnt = mysql_fetch_assoc(mysql_query($query_1));

 $blocks=$cnt['Total']/4 + (0 == $cnt['Total'] % 4 ? 0 : 1);

 for ($x=0; $x<$blocks; $x++) {
       $y=$x*4;
       print "SELECT * FROM prop where ref='SB2004' 
           ORDER BY primary_key LIMIT $y,4<br />\n"
 }
于 2013-10-30T12:51:14.797 に答える