Maison >base de données >tutoriel mysql >Comment puis-je agréger efficacement une seule colonne dans une requête SQL multi-colonnes ?
Agréger une seule colonne dans une requête avec une table multi-colonnes
Dans une situation où vous avez une requête avec plusieurs colonnes et souhaitez agréger une seule colonne spécifique, cela peut présenter un défi. Considérez la requête suivante :
SELECT t1.foo1, t1.foo2, t2.foo3, t2.foo4, string_agg(t3.aggregated_field, ', ') FROM tbl1 t1 LEFT JOIN tbl2 t2 ON t1.id = t2.fkeyid LEFT JOIN tbl3 t3 ON t2.id = t3.fkeyid GROUP BY t1.foo1, t1.foo2, t2.foo3, t2.foo4, t2.foo5, t2.foo6 ORDER BY t2.foo5, t2.foo6
Pendant que la requête fonctionne, elle devient verbeuse en raison de la nécessité de répertorier tous les champs non agrégés dans les clauses GROUP BY et ORDER BY. Cette contrainte survient car les agrégats ne sont pas autorisés dans ces clauses.
Heureusement, pour PostgreSQL 9.1 et versions ultérieures, une solution plus simple existe. En tirant parti du concept de regroupement par clés primaires, la requête peut être considérablement simplifiée :
SELECT foo1, foo2, foo3, foo4, foo5, foo6, string_agg(aggregated_field, ', ') FROM tbl1 GROUP BY 1 ORDER BY foo7, foo8; -- had to spell out, since no longer in select list!
Cependant, si la requête implique plusieurs tables avec des relations complexes, il peut être plus efficace d'adopter une approche alternative. En effectuant d'abord l'agrégation, puis en joignant les résultats, la partie non agrégée de la requête peut être optimisée :
SELECT t1.foo1, t1.foo2, ... , t2.bar1, t2.bar2, ... , a.aggregated_col FROM tbl1 t1 LEFT JOIN tbl2 t2 ON ... ... LEFT JOIN ( SELECT some_id, string_agg(agg_col, ', ') AS aggregated_col FROM agg_tbl a ON ... GROUP BY some_id ) a ON a.some_id = ?.some_id ORDER BY ...
Dans ce scénario, la majorité de la requête peut se dérouler sans agrégation, ce qui entraîne une amélioration des performances.
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!