Requête avec une JOINTURE GAUCHE de ne pas retourner des lignes pour compter de 0
J'essaie d'obtenir la suivante pour retourner un nombre pour chaque organisation à l'aide d'une jointure gauche dans PostgreSQL, mais je ne peux pas comprendre pourquoi ça ne fonctionne pas:
select o.name as organisation_name,
coalesce(COUNT(exam_items.id)) as total_used
from organisations o
left join exam_items e on o.id = e.organisation_id
where e.item_template_id = #{sanitize(item_template_id)}
and e.used = true
group by o.name
order by o.name
À l'aide de coalesce
ne semble pas fonctionner. Je suis à mon wit's end! Toute aide serait certainement apprécié!
De préciser ce qui ne marche pas, au moment où la requête ne retourne des valeurs pour les organisations qui ont un nombre supérieur à 0. Je voudrais qu'elle retourne une ligne pour chaque organisation, quel que soit le nombre de.
Définitions de Table:
TABLE exam_items
id serial NOT NULL
exam_id integer
item_version_id integer
used boolean DEFAULT false
question_identifier character varying(255)
organisation_id integer
created_at timestamp without time zone NOT NULL
updated_at timestamp without time zone NOT NULL
item_template_id integer
stem_id integer
CONSTRAINT exam_items_pkey PRIMARY KEY (id)
TABLE organisations
id serial NOT NULL
slug character varying(255)
name character varying(255)
code character varying(255)
address text
organisation_type integer
created_at timestamp without time zone NOT NULL
updated_at timestamp without time zone NOT NULL
super boolean DEFAULT false
CONSTRAINT organisations_pkey PRIMARY KEY (id)
coalesce(COUNT(exam_items.id),0) as total_used
???- et bien oui, j'ai aussi essayé le COMTE(exam_items.id) comme total_used, mais je dois dire que sql n'est pas vraiment mon fort!
- désolé je vois ce que tu veux dire! J'ai essayé, mais toujours pas de chance :/
- Quand vous postez une question, merci de préciser ce que "ça ne marche pas" s'entend dans la question - retour rien, en retournant une valeur incorrecte, ce qui donne une erreur, etc.
- merci, tout à fait logique! cependant, même en utilisant la ligne comme vous l'avez suggéré, à la requête de toujours retourner uniquement les valeurs pour les organisations avec un nombre supérieur à 0 - je me demande si cela n'a rien à faire et exam_items.utilisé = true
- Pas d'importance, mais tout de même importantes:
organisation_id integer REFERENCES organisations(id)
Vous devez vous connecter pour publier un commentaire.
Cela devrait fonctionner:
Vous avez eu une
LEFT [OUTER] JOIN
mais le plus tardWHERE
conditions agir comme une plaine[INNER] JOIN
.Déplacer la condition(s) à la
JOIN
clause pour le faire fonctionner comme prévu. De cette façon, seules les lignes qui remplissent toutes ces conditions sont joints à la première place (ou des colonnes de la droit table sont remplis avec des valeurs NULL). Comme vous l'avait, rejoint les lignes sont testés pour des conditions additionnelles pratiquement après laLEFT JOIN
et supprimés s'ils ne passent pas, comme une plaineJOIN
.COUNT()
jamais renvoie la valeur NULL pour commencer. C'est une exception parmi les fonctions d'agrégation à cet égard. Par conséquent,jamais de sens, même avec des paramètres supplémentaires. Le manuel:COALESCE(COUNT(col))
Gras c'est moi qui souligne.
Pour le rendre clair,
la ligne importante est
GROUP BY MAIN_TABLE
qui va gérer la valeur NULL à partir de SOME_TABLE