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;
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;
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;
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!