Maison >base de données >tutoriel mysql >Comment résoudre l'erreur de clause ORDER BY incompatible avec DISTINCT ON de PostgreSQL ?
Dépannage de l'erreur de non-concordance de clause DISTINCT ON de PostgreSQL
La clause DISTINCT ON
de PostgreSQL nécessite que l'expression ORDER BY
corresponde précisément aux colonnes distinctes. Tenter une requête avec des expressions différentes entraînera une erreur. Le simple fait d'ajouter address_id
comme premier élément de la clause ORDER BY
, bien qu'il s'agisse d'une solution à l'erreur, pourrait ne pas renvoyer les résultats escomptés.
Voici des méthodes alternatives pour récupérer les données correctes sans modifier le ORDER BY
dans la clause DISTINCT ON
:
Méthode 1 : Approche du plus grand N-par-groupe (Agnostique du SGBD)
Cette méthode utilise une sous-requête pour trouver le maximum purchased_at
pour chaque address_id
, puis revient à la table d'origine pour récupérer la ligne complète :
<code class="language-sql">SELECT t1.* FROM purchases t1 JOIN ( SELECT address_id, max(purchased_at) as max_purchased_at FROM purchases WHERE product_id = 1 GROUP BY address_id ) t2 ON t1.address_id = t2.address_id AND t1.purchased_at = t2.max_purchased_at ORDER BY t1.purchased_at DESC;</code>
Méthode 2 : Solution spécifique à PostgreSQL
Cette approche exploite une requête imbriquée, en utilisant DISTINCT ON
dans la requête interne pour sélectionner la ligne souhaitée pour chaque address_id
, puis en ordonnant les résultats finaux selon les besoins dans la requête externe :
<code class="language-sql">SELECT * FROM ( SELECT DISTINCT ON (address_id) * FROM purchases WHERE product_id = 1 ORDER BY address_id, purchased_at DESC ) t ORDER BY purchased_at DESC;</code>
Ces approches fournissent des solutions flexibles pour récupérer les données nécessaires tout en conservant l'ordre de tri souhaité, évitant ainsi de devoir faire des compromis sur l'expression DISTINCT ON
de la clause ORDER BY
.
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!