Rumah  >  Artikel  >  pangkalan data  >  Bagaimana untuk Meniru PostgreSQL's SELECT DISTINCT ON Functionality dalam MySQL?

Bagaimana untuk Meniru PostgreSQL's SELECT DISTINCT ON Functionality dalam MySQL?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-10 15:49:02749semak imbas

How to Replicate PostgreSQL's SELECT DISTINCT ON Functionality in MySQL?

POSTGRESQL KE MYSQL: Menukar SELECT DISTINCT ON Queries

Menavigasi migrasi pangkalan data boleh menjadi mencabar, terutamanya apabila beralih daripada PostgreSQL ke MySQL. Satu binaan pertanyaan biasa, SELECT DISTINCT ON, menimbulkan persoalan tentang rakan sejawat MySQLnya.

Postgresql SELECT DISTINCT ON

Dalam PostgreSQL, SELECT DISTINCT ON membenarkan penghapusan pendua baris berdasarkan ungkapan yang ditentukan (col1, col2, col3) sambil mengekalkan baris "pertama" untuk setiap set unik. Sebagai contoh, jika jadual mengandungi baris pendua:

col1 | col2 | col3 | col4 | col5
--------------------------------
1 | 2 | 3 | 777 | 888
1 | 2 | 3 | 888 | 999
3 | 3 | 3 | 555 | 555

Pertanyaan SELECT DISTINCT ON (col1, col2, col3) col4, col5 FROM tablename akan kembali:

col4 | col5
-----------
777 | 888
555 | 555

Pilihan baris "pertama" tidak dapat diramalkan tanpa menyatakan klausa ORDER BY.

Pelanjutan MySQL kepada GROUP BY

MySQL melanjutkan penggunaan GROUP BY, membenarkan pemilihan daripada lajur bukan teragregat yang tidak dinamakan secara eksplisit dalam klausa GROUP BY. Walau bagaimanapun, pilihan nilai pelayan daripada setiap kumpulan adalah sewenang-wenangnya, mengakibatkan nilai yang tidak dapat diramalkan dalam output pertanyaan.

Menukar kepada MySQL

MySQL tidak mempunyai persamaan yang tepat dengan PostgreSQL SELECT DISTINCT ON construct. Satu pendekatan untuk meniru fungsinya ialah melalui sambungan MySQL kepada GROUP BY:

SELECT col4, col5
FROM tablename
GROUP BY col1, col2, col3

Pertanyaan ini akan mengembalikan baris "pertama" untuk setiap set (col1, col2, col3), serupa dengan pertanyaan PostgreSQL. Walau bagaimanapun, baris yang dikembalikan masih tidak dapat ditentukan kerana ketiadaan pesanan mengikut klausa.

Pemilihan baris "pertama" yang lebih tepat boleh dicapai dengan mengubah suai pertanyaan:

SELECT t1.col4, t1.col5
FROM tablename t1 INNER JOIN (SELECT col1, col2, col3, MIN(col4) as m_col4
                              FROM tablename
                              GROUP BY col1, col2, col3) s
     ON t1.col1=s.col1
        AND t1.col2=s.col2
        AND t1.col3=s.col3
        AND t1.col4=s.m_col4
GROUP BY
  t1.col1, t1.col2, t1.col3, t1.col4

Ini pertanyaan secara berkesan mendapatkan semula baris dengan nilai minimum untuk col4 untuk setiap set ekspresi unik (col1, col2, col3), memberikan output yang lebih boleh diramal.

Kesimpulan

Menukar pertanyaan PostgreSQL kepada rakan sejawat MySQL memerlukan analisis kes demi kes. Walaupun persamaan yang tepat mungkin tidak selalu wujud, pelbagai strategi dan penyelesaian menawarkan penyelesaian, daripada yang agak mudah kepada sederhana kompleks, bergantung pada jenis pertanyaan.

Atas ialah kandungan terperinci Bagaimana untuk Meniru PostgreSQL's SELECT DISTINCT ON Functionality dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn