Maison >base de données >tutoriel mysql >Comment obtenir la fonctionnalité DISTINCT ON de Postgresql dans MySQL ?
Traduire les requêtes DISTINCT ON de Postgresql vers MySQL
La migration de Postgresql vers MySQL nécessite souvent d'adapter les requêtes existantes. L'un de ces types de requête est la requête DISTINCT ON, qui récupère des lignes uniques tout en considérant plusieurs colonnes. Bien que MySQL ne dispose pas d'un équivalent exact, il existe des approches pour obtenir des fonctionnalités similaires.
SELECT DISTINCT ON de Postgresql
La requête SELECT DISTINCT ON de Postgresql récupère des lignes distinctes en fonction des colonnes spécifiées. Par exemple :
SELECT DISTINCT ON (col1, col2, col3) col4, col5 FROM tablename
Cette requête renvoie une seule ligne pour chaque combinaison unique de (col1, col2, col3), en conservant les premières valeurs col4 et col5 rencontrées.
MySQL Group By Extension
MySQL étend la clause GROUP BY pour permettre la sélection de colonnes non agrégées. Cependant, la ligne spécifique renvoyée pour chaque groupe est indéterminée. Cela signifie qu'une requête telle que :
SELECT col4, col5 FROM tablename GROUP BY col1, col2, col3
est équivalente à la requête DISTINCT ON de Postgresql en termes de sélection de lignes. Cependant, la ligne renvoyée n'est pas prévisible.
Adaptation à MySQL
Pour garantir la prévisibilité, une approche ordonnée est nécessaire. Malgré l'attrait d'utiliser une sous-requête avec ORDER BY, l'optimiseur de MySQL peut ne pas la respecter.
Une approche plus fiable est :
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
Cette requête trouve la première ligne rencontrée satisfaisant le DISTINCT ON critères dans Postgresql en utilisant une sous-requête corrélée pour récupérer la valeur col4 minimale pour chacun group.
Conclusion
Bien que la requête DISTINCT ON de Postgresql n'ait pas d'équivalent direct dans MySQL, il existe des solutions de contournement. Le choix de l'approche dépend de la requête spécifique et du niveau de complexité souhaité.
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!