Laravel Eloquent mengisih mengikut tarikh dan juga menyimpan entri mengikut indeks kedudukan
P粉002023326
2023-08-30 14:46:23
<p>Saya sedang membina projek menggunakan Laravel dan saya mempunyai jadual dengan semua produk saya. Pada jadual ini, produk ditambah setiap hari dan saya memaparkan semua produk pada halaman yang diisih mengikut <code>created_at</code>. Ini boleh dilakukan dengan mudah menggunakan Laravel Eloquent dan <code>->orderBy('created_at', 'DESC')</code>. </p>
<p>Walau bagaimanapun, saya ingin dapat "pin"/"pin" produk tertentu ke lokasi tertentu. Untuk melakukan ini, saya mencipta lajur <code>rank_index</code> yang mengandungi nombor yang sepatutnya ada pada produk dalam koleksi pertanyaan yang dikembalikan. </p>
<p>Ini ialah jadual semasa saya: </p>
<pre class="brush:php;toolbar:false;">title rank_index created_at
Produk hebat 2023-01-01 10:04:00
Produk lain 4 2023-01-01 10:00:00
Kereta bayi 2023-01-01 10:05:00
Permaidani hijau 2 2023-01-01 10:08:00
Mainan 2023-01-01 10:07:00</pra>
<p>Jadual berikut menunjukkan koleksi yang saya mahu pertanyaan dikembalikan: </p>
<pre class="brush:php;toolbar:false;">title rank_index created_at
Mainan 2023-01-01 10:07:00
Permaidani hijau 2 2023-01-01 10:08:00
Kereta bayi 2023-01-01 10:05:00
Produk lain 4 2023-01-01 10:00:00
Produk hebat 2023-01-01 10:04:00</pre>
<p>Saya harap ada penyelesaian untuk mengembalikan jadual sedemikian terus daripada pangkalan data. Dengan cara ini saya tidak perlu membelah dan menghiris koleksi yang menjadikan permintaan lebih perlahan! Jika tidak, saya perlu menggunakan fungsi PHP untuk menyusun semula, memisahkan dan menghiris koleksi. </p>
<p>Saya berbesar hati untuk sebarang bantuan! </p>
<p>Sekian</p>
Saya hampir pasti akan memilih penyelesaian perak
Kenyataan Anda:
Tidak masuk akal. Membelah/menghiris/mencantum kedua-dua set hasil bersama-sama tidak mungkin mempunyai kesan yang boleh diukur pada prestasi. Ia pastinya tidak akan membuat "permintaan lambat"!
Ini ialah penyelesaian SQL untuk senario anda, tetapi hampir pasti akan lebih perlahan daripada mencantumkan dua set hasil bersama-sama, bergantung pada saiz jadual yang terlibat.
Jika anda mempunyai lebih daripada 1000 mainan, cte rekursi akan mencapai nilai lalai cte_max_recursion_depth, seperti yang dijelaskan di sini.
Anda boleh mengalih keluar had dengan menjalankan arahan berikut sebelum pertanyaan di atas:
atau tukar rekursif CTE kepada CTE bukan rekursif dengan "nofollow noreferrer">ROW_NUMBER() pada jadual mainan:
Ini adalah dbfiddle yang boleh anda mainkan.
Saya telah menemuinya tahun ini Menyusun terus dalam pertanyaan adalah lebih rumit Anda boleh merujuk kepada soalan ini Set hasil MySQL diisih mengikut kedudukan tetapJika anda ingin memahami kerumitannya secara mendalam.
Apa yang saya lakukan sebelum ini agak mudah dan diselesaikan melalui dua pertanyaan,
Berikut adalah contoh yang boleh anda rujuk