Saya memiliki kueri di mana saya memiliki CTE yang memilih beberapa baris dalam urutan tertentu, dan saya ingin menggunakan urutan yang sama untuk set data utama saya, saya kembali:

WITH selector (id) AS (SELECT id FROM ..... ORDER BY something)
SELECT ...
FROM users u
JOIN selector s ON s.id = u.id
ORDER BY FIELD(u.id, (SELECT id FROM selector))

Tapi ini bukan sintaks yang valid dalam urutan terakhir berdasarkan pernyataan lapangan karena sub kueri mengembalikan lebih dari satu baris, apakah mungkin untuk mencapai sesuatu seperti ini?

0
Daniel Robinson 4 April 2021, 13:49

1 menjawab

Jawaban Terbaik

Fungsi FIELD() Kebutuhan daftar nilai dan bukan hasil dari kueri.

Anda dapat menggunakan fungsi GROUP_CONCAT() untuk membuat daftar ID yang dipisahkan koma yang dikembalikan oleh CTE, dipesan oleh kondisi Anda dan kemudian fungsi FIND_IN_SET() untuk bergabung dengan cte ke tabel dan mengurutkan berdasarkan hasilnya:

WITH selector (ids) AS (SELECT GROUP_CONCAT(id ORDER BY something) FROM .....)
SELECT ...
FROM users u INNER JOIN selector s 
ON FIND_IN_SET(u.id, s.ids)
ORDER BY FIND_IN_SET(u.id, s.ids)

Atau, gunakan fungsi jendela ROW_NUMBER():

WITH selector (id, rn) AS (SELECT id, ROW_NUMBER() OVER (ORDER BY something) FROM .....)
SELECT ...
FROM users u INNER JOIN selector s 
ON s.id = u.id
ORDER BY s.rn
1
forpas 4 April 2021, 11:08