Maison > base de données > tutoriel mysql > le corps du texte

Comment répliquer la fonctionnalité SELECT DISTINCT ON de PostgreSQL dans MySQL ?

Mary-Kate Olsen
Libérer: 2024-11-10 15:49:02
original
746 Les gens l'ont consulté

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

POSTGRESQL VERS MYSQL : conversion des requêtes SELECT DISTINCT ON

La navigation dans les migrations de bases de données peut être difficile, en particulier lors de la transition de PostgreSQL vers MySQL. Une construction de requête courante, SELECT DISTINCT ON, soulève des questions sur son homologue MySQL.

Postgresql SELECT DISTINCT ON

Dans PostgreSQL, SELECT DISTINCT ON permet d'éliminer les doublons. lignes basées sur des expressions spécifiées (col1, col2, col3) tout en conservant la "première" ligne pour chaque ensemble unique. Par exemple, si une table contient des lignes en double :

col1 | col2 | col3 | col4 | col5
--------------------------------
1 | 2 | 3 | 777 | 888
1 | 2 | 3 | 888 | 999
3 | 3 | 3 | 555 | 555
Copier après la connexion

La requête SELECT DISTINCT ON (col1, col2, col3) col4, col5 FROM tablename renverrait :

col4 | col5
-----------
777 | 888
555 | 555
Copier après la connexion

La sélection de la "première" ligne est imprévisible sans spécifier de clause ORDER BY.

Extension MySQL à GROUP BY

MySQL étend l'utilisation de GROUP BY, permettant la sélection de colonnes non agrégées non nommées explicitement dans la clause GROUP BY. Cependant, le choix de la valeur par le serveur dans chaque groupe est arbitraire, ce qui entraîne des valeurs imprévisibles dans le résultat de la requête.

Conversion vers MySQL

MySQL n'a pas d'équivalent exact au Construction PostgreSQL SELECT DISTINCT ON. Une approche pour émuler ses fonctionnalités consiste à utiliser l'extension MySQL de GROUP BY :

SELECT col4, col5
FROM tablename
GROUP BY col1, col2, col3
Copier après la connexion

Cette requête renverra la "première" ligne pour chaque ensemble (col1, col2, col3), similaire à la requête PostgreSQL. Cependant, la ligne renvoyée reste indéterminée du fait de l'absence de clause order by.

Une sélection plus précise de la "première" ligne peut être obtenue en modifiant la requête :

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
Copier après la connexion

Ceci La requête récupère efficacement la ligne avec la valeur minimale pour col4 pour chaque ensemble unique d'expressions (col1, col2, col3), fournissant ainsi un résultat plus prévisible.

Conclusion

La conversion des requêtes PostgreSQL en équivalents MySQL nécessite une analyse au cas par cas. Bien que des équivalents exacts n'existent pas toujours, diverses stratégies et solutions de contournement proposent des solutions, allant de relativement simples à modérément complexes, selon la nature de la requête.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal