Saya bertanya-tanya apakah ada jauh (mungkin cara yang lebih baik) untuk memesan dengan urutan nilai-nilai dalam klausa IN ().
Masalahnya adalah bahwa saya memiliki 2 pertanyaan, yang mendapatkan semua ID dan yang kedua yang mengambil semua informasi. Yang pertama membuat urutan ID yang saya ingin yang kedua memesan. ID dimasukkan dalam klausa IN () dengan urutan yang benar.
Jadi itu akan menjadi sesuatu seperti (sangat disederhanakan):
SELECT id FROM table1 WHERE ... ORDER BY display_order, name
SELECT name, description, ... WHERE id IN ([id's from first])
Masalahnya adalah bahwa kueri kedua tidak mengembalikan hasil dalam urutan yang sama bahwa ID dimasukkan ke dalam klausa IN ().
Salah satu solusi yang saya temukan adalah dengan meletakkan semua ID ke tabel temp dengan bidang penambahan otomatis yang kemudian bergabung ke dalam kueri kedua.
Apakah ada opsi yang lebih baik?
Catatan: Karena kueri pertama dijalankan "oleh pengguna" dan kueri kedua dijalankan dalam proses latar belakang, tidak ada cara untuk menggabungkan kueri 2 menjadi 1 menggunakan sub kueri.
Saya menggunakan MySQL, tapi saya pikir mungkin berguna untuk mencatat opsi apa yang ada untuk DB lain juga.
sumber
IN
danFIELD
parameter sama. Melakukan ini dalam kode program mungkin lebih cepat dengan menggunakan pengetahuan tambahan itu. Tentu saja, akan lebih bijaksana untuk menempatkan beban ini pada klien daripada server jika Anda memiliki kinerja server dalam pikiran.sqlite
?Lihat mengikuti cara mendapatkan data yang diurutkan.
sumber
Dua solusi yang muncul dalam pikiran:
order by case id when 123 then 1 when 456 then 2 else null end asc
order by instr(','||id||',',',123,456,') asc
(
instr()
berasal dari Oracle; mungkin Anda memilikilocate()
ataucharindex()
atau sesuatu seperti itu)sumber
Ans untuk mendapatkan data yang diurutkan.
sumber
Jika Anda ingin melakukan pengurutan sewenang-wenang pada kueri menggunakan nilai yang dimasukkan oleh kueri di MS SQL Server 2008+ , itu bisa dilakukan dengan membuat tabel saat itu juga dan melakukan penggabungan seperti itu (menggunakan nomenklatur dari OP).
Jika Anda mengganti pernyataan VALUES dengan sesuatu yang lain melakukan hal yang sama, tetapi dalam ANSI SQL, maka ini harus bekerja pada basis data SQL apa pun.
Catatan: Kolom kedua dalam tabel yang dibuat (orderTbl.orderIdx) diperlukan ketika kueri catatan set lebih besar dari 100 atau lebih. Saya awalnya tidak memiliki kolom orderIdx, tetapi menemukan bahwa dengan set hasil lebih besar dari 100 saya harus secara eksplisit mengurutkan berdasarkan kolom itu; dalam SQL Server Express 2014.
sumber
orderTbl.orderKey
,orderTbl.orderIndex
olehorderKey
,orderIndex
bekerja sangat bagus
sumber
Klausa IN menjelaskan seperangkat nilai, dan set tidak memiliki urutan.
Solusi Anda dengan gabungan dan kemudian memesan pada
display_order
kolom adalah solusi yang hampir benar; hal lain mungkin merupakan peretas khusus DBMS (atau sedang melakukan beberapa hal dengan fungsi OLAP dalam SQL standar). Tentu saja, gabungannya adalah solusi yang hampir portabel (meskipun menghasilkan data dengandisplay_order
nilai - nilai mungkin bermasalah). Perhatikan bahwa Anda mungkin perlu memilih kolom pemesanan; yang dulunya persyaratan dalam SQL standar, meskipun saya percaya itu santai sebagai aturan beberapa waktu lalu (mungkin dulu sebagai SQL-92).sumber
Untuk Oracle, solusi John menggunakan fungsi instr () berfungsi. Inilah solusi yang sedikit berbeda yang berhasil -
SELECT id FROM table1 WHERE id IN (1, 20, 45, 60) ORDER BY instr('1, 20, 45, 60', id)
sumber
Gunakan fungsi FIND_IN_SET MySQL :
sumber
Saya hanya mencoba melakukan ini adalah MS SQL Server di mana kami tidak memiliki FIELD ():
Perhatikan bahwa saya juga memperbolehkan duplikasi.
sumber
Pikiran pertama saya adalah menulis satu permintaan, tetapi Anda mengatakan itu tidak mungkin karena satu dijalankan oleh pengguna dan yang lainnya dijalankan di latar belakang. Bagaimana Anda menyimpan daftar id untuk diteruskan dari pengguna ke proses latar belakang? Mengapa tidak meletakkannya di tabel sementara dengan kolom untuk menandakan pesanan.
Jadi bagaimana dengan ini:
sumber
Saya pikir Anda harus mengelola untuk menyimpan data Anda dengan cara yang Anda hanya akan bergabung dan itu akan sempurna, sehingga tidak ada peretasan dan hal-hal rumit yang terjadi.
Misalnya saya memiliki daftar "track baru-baru ini" dari id lagu, di SQLite saya cukup lakukan:
sumber
Coba ini:
WHEREs mungkin perlu sedikit penyesuaian agar subquery yang berkorelasi berfungsi dengan baik, tetapi prinsip dasarnya haruslah baik.
sumber