1

MYSQL を使用して、選択したい

1) 「価格」列で並べ替えた後、上位 20 行からランダムに 5 行

2) 「価格」列で並べ替えた後の 30 個の次の結果 (行 21 ~ 50) の中の 15 個のランダムな行

SQLでこれをパフォーマンス的に達成するための最良の方法は何ですか? テーブルには約 1,000,000 行が含まれていることに注意してください。

最終的な目的は、これらのランダムに選択された行の列を更新する (SET status=1) ことです。

4

2 に答える 2

1

ネストされた選択を使用する - この状況では非常に高速なはずです

select * from 
(
select .... from table 
order by price
limit X, Y
)
order by random

X と Y を適切な値に置き換えます

特定の RDBMS によっては、"order by random" 句と "limit" 句が異なる場合があることに注意してください。これがMySQLのやり方です。

最も重要なことは、サーバーが最初に内部選択を実行することです。これにより、20 ~ 30 行 (制限句によって異なります) が返され、外部選択でランダムな順序で並べ替えることができます。価格列がインデックス化されている場合、これは十分に高速です

于 2013-05-08T16:24:50.617 に答える
1
  ( SELECT dt.*
    FROM 
      ( SELECT t.*                    -- columns you need from the table
        FROM tableX AS t              -- your table name in place of "tableX"
        ORDER BY price DESC
          LIMIT 20
          OFFSET 0
      ) AS dt
    ORDER BY RAND()
      LIMIT 5
  )
  UNION ALL 
  (
    SELECT dt.*
    FROM 
      ( SELECT t.* 
        FROM tableX AS t 
        ORDER BY price DESC
          LIMIT 30
          OFFSET 20
      ) AS dt
    ORDER BY RAND()
      LIMIT 15
   ) ;
于 2013-05-08T16:58:16.260 に答える