Saya ingin menggunakan order by with union dalam kueri mysql. Saya mengambil jenis rekaman yang berbeda berdasarkan kriteria yang berbeda dari tabel berdasarkan jarak untuk penelusuran di situs saya. Kueri pemilihan pertama mengembalikan data yang terkait dengan pencarian tempat yang tepat. Kueri pemilihan ke-2 mengembalikan data yang terkait dengan jarak dalam 5 km dari tempat yang dicari. Kueri pemilihan ke-3 mengembalikan data yang terkait dengan jarak dalam 5-15 km dari tempat yang dicari.
Kemudian saya menggunakan union untuk menggabungkan semua hasil dan ditampilkan di halaman dengan paging. Di bawah judul yang sesuai sebagai 'Hasil pencarian tepat' , 'Hasil dalam 5 km', dll
Sekarang saya ingin mengurutkan hasil berdasarkan id atau add_date. Tetapi ketika saya menambahkan pesanan dengan klausa di akhir kueri saya (kueri1 permintaan serikat 2 permintaan serikat 3 pesanan oleh add_date). Itu menyortir semua hasil. Tapi yang saya inginkan adalah itu harus diurutkan di bawah setiap judul.
sumber
Jawaban:
Anda dapat melakukan ini dengan menambahkan pseudo-kolom bernama rank ke setiap pilihan, yang dapat Anda urutkan terlebih dahulu, sebelum mengurutkan berdasarkan kriteria Anda yang lain, misalnya:
sumber
a
dan akhirnya?order by
? ( "untuk mengurutkan atau membatasi keseluruhanUNION
hasil, tanda kurungSELECT
pernyataan individu dan tempatkanORDER BY
atauLIMIT
setelah yang terakhir" ). Bandingkan kode Anda dengan i.stack.imgur.com/LpTMU.pngAnda dapat menggunakan subkueri untuk melakukan ini:
sumber
SELECT * FROM ( SELECT aaa AS Col, 1 AS Official FROM table1 UNION ALL SELECT bbb AS Col, 0 AS Official FROM table2 ) AS tbl ORDER BY Official, Col
ORDER BY
untukSELECT
pernyataan individu tidak menyiratkan apa pun tentang urutan kemunculan baris pada hasil akhirsumber
Kueri gabungan hanya dapat memiliki satu
ORDER BY
klausa master , IIRC. Untuk mendapatkan ini, dalam setiap kueri yang membuat kueri yang lebih besarUNION
, tambahkan bidang yang akan menjadi satu bidang yang Anda urutkan untukUNION
ituORDER BY
.Misalnya, Anda mungkin memiliki sesuatu seperti
Itu
union_sort
lapangan dapat apa pun yang Anda mungkin ingin sortir. Dalam contoh ini, ini kebetulan menempatkan hasil dari tabel pertama pertama, tabel kedua kedua, dll.sumber
Jangan lupa, penyatuan semua adalah cara untuk menambahkan catatan ke kumpulan catatan tanpa penyortiran atau penggabungan (sebagai lawan dari penyatuan).
Jadi contohnya:
Itu membuat kueri individu lebih jelas dan memungkinkan Anda untuk mengurutkan berdasarkan parameter yang berbeda di setiap kueri. Namun dengan menggunakan cara jawaban yang dipilih, itu mungkin menjadi lebih jelas tergantung pada kompleksitas dan seberapa terkait datanya karena Anda membuat konsep pengurutan. Ini juga memungkinkan Anda untuk mengembalikan kolom buatan ke program kueri sehingga memiliki konteks yang dapat diurutkan atau diatur.
Tetapi cara ini memiliki keuntungan karena cepat, tidak memasukkan variabel tambahan, dan membuatnya mudah untuk memisahkan setiap kueri termasuk jenisnya. Kemampuan untuk menambahkan batas hanyalah bonus tambahan.
Dan tentu saja jangan ragu untuk mengubah gabungan semua menjadi satu dan menambahkan semacam untuk seluruh kueri. Atau tambahkan id buatan, dalam hal ini cara ini memudahkan pengurutan berdasarkan parameter berbeda di setiap kueri, tetapi sebaliknya sama dengan jawaban yang diterima.
sumber
Saya mendapatkan ini bekerja di join plus union.
sumber
Saat Anda menggunakan
ORDER BY
klausa di dalam sub kueri yang digunakan bersama denganUNION
mysql akan mengoptimalkanORDER BY
klausa tersebut.Ini karena secara default a
UNION
mengembalikan daftar tidak berurutan sehingga oleh karena itu anORDER BY
tidak akan melakukan apa-apa.Pengoptimalan disebutkan di dokumen dan mengatakan:
Kalimat terakhir ini agak menyesatkan karena seharusnya memiliki efek. Pengoptimalan ini menyebabkan masalah saat Anda berada dalam situasi di mana Anda perlu memesan dalam subkueri.
Untuk memaksa MySQL agar tidak melakukan pengoptimalan ini, Anda dapat menambahkan klausa LIMIT seperti ini:
Tinggi
LIMIT
berarti Anda dapat menambahkanOFFSET
kueri pada keseluruhan jika Anda ingin melakukan sesuatu seperti penomoran halaman.Ini juga memberi Anda manfaat tambahan karena dapat
ORDER BY
menggunakan kolom yang berbeda untuk setiap serikat pekerja.sumber
Mencoba:
Di mana [QUERY 1] dan [QUERY 2] adalah dua kueri Anda yang ingin Anda gabungkan.
sumber
Ini karena Anda sedang mengurutkan seluruh kumpulan hasil, Anda harus mengurutkan, setiap bagian dari gabungan secara terpisah, atau Anda dapat menggunakan ORDER BY (Sesuatu yaitu jarak subkueri) THEN (sesuatu yaitu baris id) klausa
sumber
Saya mencoba menambahkan urutan untuk setiap pertanyaan sebelum penyatuan seperti
tapi sepertinya tidak berhasil. Itu tidak benar-benar melakukan pengurutan dalam baris dari setiap pilihan.
Saya pikir Anda perlu menjaga urutan di luar dan menambahkan kolom di klausa where ke urutan oleh, seperti
Ini mungkin sedikit rumit, karena Anda ingin mengelompokkan berdasarkan rentang, tetapi saya pikir itu harus bisa dilakukan.
sumber