ホームページ >データベース >mysql チュートリアル >MySQL クエリでデータをランダムに選択して並べ替える方法は?
MySQL クエリでのランダム順と昇順の組み合わせ
かなりの数のユーザーがいるデータベース シナリオでは、次のような状況が発生する可能性があります。それらのサブセットをランダムに選択し、名前などの特定の属性でさらに並べ替えたい場合。これは単純なタスクのように思えるかもしれませんが、標準 SQL クエリでは常に望ましい結果が得られるとは限りません。
検討できるアプローチの 1 つは、ORDER BY rand() を使用することです。これは、ランダムな結果を取得するためによく使用されます。データベース。ただし、名前 ASC などの別の ORDER BY 句と組み合わせると、期待どおりに機能しない可能性があります。たとえば、次のクエリでは望ましい結果が得られない可能性があります:
<code class="sql">SELECT * FROM users WHERE 1 ORDER BY rand(), name ASC LIMIT 20</code>
このクエリは、20 人のユーザーをランダムに選択し、名前属性で昇順に並べようとします。ただし、データベース管理システム (DBMS) はクエリを左から右に処理することを理解することが重要です。したがって、この場合は、 rand() 関数が最初に適用され、データセット全体が効果的にシャッフルされます。その後、名前 ASC 句が適用されますが、データはすでにランダム化されているため、結果の順序に意味のある影響はありません。
サブクエリ ソリューション
望ましい動作を実現するには、メインクエリ内でサブクエリを使用できます。サブクエリは、データのサブセットを分離し、それに特定のロジックを適用するために使用できる入れ子になったクエリです。サブクエリを利用すると、最初に 20 人のユーザーをランダムに選択し、サブクエリ内の名前属性で並べ替えることができます。
サブクエリを利用して修正されたクエリの例を次に示します。
<code class="sql">SELECT * FROM ( SELECT * FROM users ORDER BY rand() LIMIT 20 ) T1 ORDER BY name</code>
このクエリでは、サブクエリ (SELECT * FROM users ORDER BY rand() LIMIT 20) によって、users テーブルから 20 人のユーザーがランダムな順序で選択され、一時テーブル T1 に格納されます。次に、外側のクエリは T1 からすべての列を選択し、結果を name 属性で並べ替えます。
サブクエリを使用すると、ランダムに実行したいユーザーのサブセットにのみ rand() 関数が適用されます。選択します。このアプローチでは、その後の名前の順序付けがすでにランダム化されたデータに適用され、ランダムに選択された 20 人のユーザーが名前のアルファベット順に並べられた望ましい結果が生成されることが保証されます。
以上がMySQL クエリでデータをランダムに選択して並べ替える方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。