Maison >base de données >tutoriel mysql >Comment obtenir la fonctionnalité DISTINCT ON de Postgresql dans MySQL ?

Comment obtenir la fonctionnalité DISTINCT ON de Postgresql dans MySQL ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-10 22:56:03229parcourir

How to Achieve the Functionality of Postgresql's DISTINCT ON in 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!

Déclaration:
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