Maison > base de données > tutoriel mysql > Comment répliquer SELECT DISTINCT ON de Postgresql dans MySQL ?

Comment répliquer SELECT DISTINCT ON de Postgresql dans MySQL ?

Barbara Streisand
Libérer: 2024-11-08 16:59:02
original
1093 Les gens l'ont consulté

How to Replicate Postgresql's SELECT DISTINCT ON in MySQL?

Conversion de SELECT DISTINCT ON de Postgresql vers MySQL

Lors de la migration de Postgresql vers MySQL, il peut être nécessaire de convertir des requêtes à l'aide de SELECT DISTINCT de Postgresql ON à leurs équivalents MySQL.

Postgresql SELECT DISTINCT ON

Dans Postgresql, SELECT DISTINCT ON est utilisé pour supprimer les lignes en double en fonction de la combinaison unique de colonnes spécifiées. Il élimine toutes les lignes correspondantes et ne conserve que la "première" ligne pour chaque combinaison distincte.

Extension MySQL à GROUP BY

MySQL n'a pas d'équivalent exact à SELECT DISTINCT SUR. Au lieu de cela, il utilise une extension de GROUP BY qui permet de sélectionner des colonnes non agrégées même si elles ne sont pas nommées dans la clause GROUP BY. Cependant, le choix de la valeur de chaque groupe est imprévisible. Par conséquent, nous pouvons potentiellement utiliser GROUP BY dans MySQL pour obtenir un effet similaire :

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 combinaison (col1, col2, col3), mais l'ordre spécifique de ces lignes sont indéterminées.

Maintenir l'ordre des lignes

Pour spécifier l'ordre des lignes renvoyées, nous pouvons utilisez une sous-requête :

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

Bien que cette approche semble logique, MySQL a toujours la possibilité de sélectionner n'importe quelle valeur pour col4 et col5. Pour garantir l'ordre des lignes attendu, nous avons besoin d'une requête plus complexe :

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

Conclusion

Bien qu'il n'y ait pas de traduction directe de SELECT DISTINCT ON de Postgresql vers MySQL, les solutions de contournement utilisant GROUP BY et les sous-requêtes fournissent la fonctionnalité souhaitée. Cependant, les requêtes MySQL résultantes peuvent être plus complexes que leurs homologues Postgresql.

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