0

なぜ私のASC / DESC ORDER BYが私がやりたいことをしていないのか分かりません。

価格列の見出しをクリックすると、ページの LIMIT を超えてもテーブル データ全体が注文されますか? どうすればこれを修正できますか?

<?php
$c=$_GET['c'];
$s=$_GET['s'];
$d=$_GET['d'];
$l=$_GET['l'];
if($d==1) { $DIRECTION='ASC'; } elseif($d==0) { $DIRECTION='DESC'; } else { $DIRECTION='DESC'; }
if($l>51) { $l=50; } else { $l=$_GET['l']; }
$sql=mysql_query("SELECT id,title,price FROM listings WHERE status IN(0,1,4,5) ORDER BY $s $DIRECTION LIMIT $c,$l"); 
?>

これは、URLがどのように見えるかです

c=10&s=price&d=1&l=25

上記の URL では、昇順データの 10 行目から 25 のエントリが表示されますが、価格列見出しのリンクをクリックすると、ASC が DESC に変更され、動作しますが、最後から最低価格または最高価格が表示されます。 LIMIT 10,25? を無視します。

それはどのように機能しますか?

ジョニーを助けることができる人に前もって感謝します

4

1 に答える 1

0

彼らは働きます。それが方法LIMITであり、機能するようにORDER BY設計されています。

つまり、データベースは、LIMIT句を適用する前に、常にデータを並べ替えます。適用後にデータを並べ替える場合LIMITは、次の2つのオプションがあります。

  • PHPを使用して並べ替えます。これはおそらく比較的簡単な解決策であり、データベースが不必要な作業をあまり行わないようにしたい場合は、より良い方法かもしれません。ただし、結果を使用する前にすべてを配列に読み込むのではなく、結果をデータストリームとして使用すると、少し面倒になる可能性があります。

  • サブクエリを使用します。この場合、LIMITソートする前に句を強制的に適用します。

    SELECT * FROM (SELECT id,title,price FROM listings WHERE status IN(0,1,4,5) LIMIT $c,$l) ORDER BY $s $DIRECTION

于 2012-09-18T11:33:14.130 に答える