Laravel を使用してプロジェクトを構築しており、すべての製品を含むテーブルがあります。このテーブルでは、製品が毎日追加され、ページ上のすべての製品が created_at
で並べ替えられて表示されます。これは、Laravel Eloquent と ->orderBy('created_at', 'DESC')
を使用して簡単に行うことができます。
ただし、特定の製品を特定の場所に「固定」/「固定」できるようにしたいと考えています。これを行うために、返されるクエリ コレクション内で製品に必要な番号を含む rank_index
列を作成しました。
これは私の現在のテーブルです:
title Rank_index created_at 素晴らしい製品 2023-01-01 10:04:00 別の製品 4 2023-01-01 10:00:00 ベビーカー 2023-01-01 10:05:00 グリーンカーペット2 2023-01-01 10:08:00 おもちゃ 2023-01-01 10:07:00
次の表は、クエリで返したいコレクションを示しています。
title Rank_index created_at おもちゃ 2023-01-01 10:07:00 グリーンカーペット2 2023-01-01 10:08:00 ベビーカー 2023-01-01 10:05:00 別の製品 4 2023-01-01 10:00:00 素晴らしい製品 2023-01-01 10:04:00
そのようなテーブルをデータベースから直接返す解決策があればいいのですが。こうすることで、コレクションを分割してスライスする必要がなくなり、リクエストが大幅に遅くなります。それ以外の場合は、PHP 関数を使用してコレクションを再配置、分割、スライスする必要があります。
何かお役に立てれば幸いです。
よろしくお願いします
私はほぼ確実に Silver のソリューションを選択します
あなたの声明:
### 意味がありません。 2 つの結果セットを分割/スライス/結合しても、パフォーマンスに測定可能な影響を与える可能性はほとんどありません。「リクエストが遅くなる」ということは決してありません!
これはあなたのシナリオに適した SQL ソリューションですが、関係するテーブルのサイズによっては、2 つの結果セットを結合するよりもほぼ確実に遅くなります。リーリー
ここで説明されているように、1000 を超えるおもちゃがある場合、再帰的 cte はデフォルト値cte_max_recursion_ Depthに達します。上記のクエリの前に次のコマンドを実行すると、制限を削除できます:
リーリーまたは、
toysテーブルの「nofollow noreferrer">ROW_NUMBER()を使用して、再帰的 CTEを非再帰的 CTE に変更します。 リーリーこれは再生可能な
dbfiddleです。
今年この問題に遭遇しました。クエリ内で直接並べ替えるのはより複雑です。MySQL の結果セットは固定位置で並べ替えられます複雑さを詳しく理解したい場合は、この質問を参照してください。
以前に行ったことは比較的単純で、2 つのクエリで完了しました。
これは参考になる例です
リーリー