Maison > base de données > tutoriel mysql > Pourquoi mon LEFT JOIN renvoie-t-il des comptes incorrects dans PostgreSQL ?

Pourquoi mon LEFT JOIN renvoie-t-il des comptes incorrects dans PostgreSQL ?

DDD
Libérer: 2025-01-14 11:17:43
original
157 Les gens l'ont consulté

Why Does My LEFT JOIN Return Incorrect Counts in PostgreSQL?

PostgreSQL LEFT JOIN : Correction des résultats de comptage incorrects

Lorsque vous utilisez un LEFT JOIN dans PostgreSQL pour compter les entrées par organisation, vous pouvez rencontrer une situation dans laquelle seules les organisations dont le nombre est supérieur à zéro sont renvoyées. Cela contredit le comportement attendu d'un LEFT JOIN, qui devrait inclure toutes les organisations, qu'elles aient ou non des entrées correspondantes dans la table jointe.

Correction de la requête LEFT JOIN

Le problème provient généralement d'un placement incorrect des conditions de filtrage. La requête révisée suivante démontre l'approche correcte :

<code class="language-sql">SELECT
  o.name AS organisation_name,
  COUNT(e.id) AS total_used
FROM
  organisations o
LEFT JOIN
  exam_items e
  ON e.organisation_id = o.id
  AND e.item_template_id = #{sanitize(item_template_id)}
  AND e.used
GROUP BY
  o.name
ORDER BY
  o.name;</code>
Copier après la connexion

La modification cruciale consiste à déplacer la condition e.used de la clause WHERE (où elle agit comme un filtre après la jointure) vers la clause ON (où elle agit comme une condition de jointure ). Cela garantit que seules les lignes correspondantes satisfaisant toutes les conditions sont incluses dans la jointure elle-même, empêchant ainsi le filtrage involontaire des organisations avec un nombre nul.

Approche optimisée : Pré-agrégation

Pour améliorer les performances, en particulier lorsque vous traitez des ensembles de données volumineux, envisagez cette requête alternative :

<code class="language-sql">SELECT
  o.id,
  o.name AS organisation_name,
  COALESCE(e.total_used, 0) AS total_used
FROM
  organisations o
LEFT JOIN
  (
    SELECT
      organisation_id AS id,
      COUNT(*) AS total_used
    FROM
      exam_items
    WHERE
      item_template_id = #{sanitize(item_template_id)}
      AND used
    GROUP BY
      1
  ) AS e
  USING (id)
ORDER BY
  o.name,
  o.id;</code>
Copier après la connexion

Cette méthode regroupe d'abord les décomptes dans une sous-requête, puis effectue la jointure. Cette pré-agrégation peut améliorer considérablement l'efficacité, en particulier lorsqu'une partie substantielle des exam_items lignes est incluse dans le décompte. La fonction COALESCE gère les cas où total_used est NULL (pour les organisations sans entrées correspondantes), en le remplaçant par 0 pour des raisons de cohérence.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal