1

私はそのような1つのテーブルを持っています

ItemsTable

item_id, cat_id, sort
----------------------
1        1       1
20       1       2
15       1       3
12       1       4
11       1       5
....
1521     1       1991

私のプログラムでは、ページが表示されるたびに、ソート番号に基づいて次のアイテムを取得します。たとえば、先ほど sort = 2 を表示したとします。次にページにアイテム sort = 3 が表示されるとします (おそらく、sort は不適切な名前です)。

私がやりたいことは、最後のアイテム (並べ替え = 1991) を取得したら、そのテーブル内のアイテムを再更新し、新しい並べ替え順序を再割り当てしたいということです。

このような:

ItemsTable

item_id, cat_id, sort
----------------------
35       1       1
7        1       2
2        1       3
1521     1       4
700      1       5
....
5        1       1991

今、私の心は、cat_id = 1 で結果をランダムにソートするレコードを選択するスクリプトを作成する必要があると考えています。次に、データベースを 1001 回更新するループを PHP で作成する必要があります。これは私の考えでは効率的ではないようです。

より良い代替案を提供できますか?MySQL でこれを行う最も効率的な方法は何ですか?

4

2 に答える 2

1
SET @row := 0;
UPDATE ItemsTable SET sort = (@row := @row + 1) WHERE cat_id = 1 ORDER BY RAND();

数時間の調査と試行錯誤の後、これで問題が解決しました。ランダムな一連の数字を生成するようになりました。

RAND() があまり効率的でないことはわかっていますが、それはまた別の問題です :)

これが誰かに役立つことを願っています。

于 2012-08-07T20:25:09.493 に答える
0

これはあなたが望むことをしますか?

order by cat_id, rand()

または、結果セットを 2 回取得しようとしていますか?

select item_id, cat_id, sort
from ((select t.*, 0 as whichgroup
       from t
      )
      union all
      (select t.*, 1 as whichgroup
       from t
      )
     ) t
order by cat_id, whichgroup,
         (case when whichgroup = 0 then sort
               else rand()
          end)

これにより、各レコードが 2 回出力されます。最初は「並べ替え」順で、次にランダムに出力されます。

あなたのコメントに基づいて、これはあなたが望むものかもしれません:

order by cat_id,
         (case when sort <= 1991 then sort else rand() end)
于 2012-08-07T18:59:02.300 に答える