1

現在取り組んでいるプロジェクトに関連する質問があります。私のスクリプトでは、現在すべての投稿が次のように表示されています。

      $sql = "SELECT * FROM posts" 
      . "\n WHERE page_slug = '" . $this->slug . "'" 
      . "\n AND active = '1'" 
      . "\n ORDER BY id DESC" . $pg->limit;
      $result = $db->fetch_all($sql);

これは問題ありませんが、今の問題は、特定のアイテムを他のすべてのアイテムよりも最初に表示したいということです。この特定のアイテムに非常に高い ID (たとえば 1000) を付けようとしましたが、新しい投稿を作成すると、新しい投稿 ID が突然 1001 で始まり、最初の位置にジャンプします。

これが起こらないようにする方法、または少なくともソート順を微調整して特定のアイテムを最初の位置に「だます」方法について誰かが考えていますか?

いくつかのアドバイスをいただければ幸いです。

どうもありがとう、パトリック

4

4 に答える 4

2
$sql = "SELECT *, case when id = 1000 then 0 else 1 end as OrderMe  FROM posts" 
  . "\n WHERE page_slug = '" . $this->slug . "'" 
  . "\n AND active = '1'" 
  . "\n ORDER BY OrderMe, id DESC" . $pg->limit;
  $result = $db->fetch_all($sql);

もちろん、case ステートメントで ID として 1000 を使用する必要はありませんが、それは一番上に置きたい ID だとおっしゃいました...

于 2012-04-13T04:00:34.003 に答える
2

あなたがtrick言ったように、この方法で DBMS を使用できます。

SELECT * FROM posts
WHERE page_slug = @slug AND active = 1
ORDER BY (id != @yourID), id DESC, LIMIT @limit

@limitとは現在の@slug変数です。変数は、一番@yourID上に表示する ID です。複数ある場合は、in()句を使用します。基本的に、これはID が探しているものと等しい投稿に対してfalse、または実際に を返し、残りの投稿に対して、または実際に を返します。0true1

したがって、その新しく生成された値に最初の昇順を適用すると、0(等しいもの) が一番上にあるものになります:)

于 2012-04-13T04:09:34.000 に答える
0

と呼ばれる新しい列rank(または意味のあるもの)を追加し、より重要な行にゼロより大きい値を割り当てることができます。次に、rank最初に で注文し、次に で注文しidます。

于 2012-04-13T04:00:07.297 に答える
0

まだ何らかのモジュールになっていない場合は、そのコードをモジュールに変換し、複製しないでください。簡単に変更できるはずです。次に、INTデータベースにいくつかのフィールド(priorityたとえば、)とORDER BY優先度を追加し、次にIDで追加します。

于 2012-04-13T04:01:13.673 に答える