OVH Cloud OVH Cloud

LFT OUTER JOIN er condition

6 réponses
Avatar
Etienne SOBOLE
Salut.

j'ai deux table qui sont liées
disons que le table 'contact' contient des utilisateur
et le table 'telephone' contient des numero de téléphone ainsi que le le
type de telephone ('PRO', 'PERSO', 'MOBILE')

j'ai besoin de connaitre pour chaque utilisateur combien il a de numéro
'PRO'
donc je fais
SELECT iduser, count(t.idtel) FROM user AS u LEFT OUTER JOIN telephone AS t
ON u.idctc = t.idctc WHERE t.typetel LIKE 'PRO';

sauf que la, j'ai jamais 0 !!!

donc j'ai mis
SELECT iduser, count(t.idtel) FROM user AS u LEFT OUTER JOIN telephone AS t
ON u.idctc = t.idctc WHERE t.typetel LIKE 'PRO' OR t.typetel IS NULL;

mais bon... ca me dérange un peu, car je peux pas etre sur qu'il n'existe
pas un numero de téléphone ayant un type non défini et donc comptabiliser
dans ma requete...

Donc comment faire ma requette pour que ca compte les numero de telephone
'PRO' et uniquement ceux la.

merci
Etienne

6 réponses

Avatar
Stéphane
"Etienne SOBOLE" a écrit:
Salut.

j'ai deux table qui sont liées
disons que le table 'contact' contient des utilisateur
et le table 'telephone' contient des numero de téléphone ainsi que le le
type de telephone ('PRO', 'PERSO', 'MOBILE')

j'ai besoin de connaitre pour chaque utilisateur combien il a de numéro
'PRO'
donc je fais
SELECT iduser, count(t.idtel) FROM user AS u LEFT OUTER JOIN telephone AS t
ON u.idctc = t.idctc WHERE t.typetel LIKE 'PRO';

sauf que la, j'ai jamais 0 !!!



Essaie avec INNER JOIN

SELECT iduser, count(t.idtel)
FROM user u
INNER JOIN telephone t ON u.idctc = t.idctc
WHERE t.typetel LIKE 'PRO';



Stéphane
La souplesse d'esprit permet de s'adapter dans toutes circonstances.

http://www.velo-passion.com pour les fans de vélo
http://www.lorimier.com/chemin-des-cretes-du-jura une ballade à pied d'une semaine à 2
http://www.baby-boum.ch l'enfant n'est-il pas l'avenir de l'homme?
Avatar
Ph. B.
Etienne SOBOLE wrote:

Salut.

j'ai deux table qui sont liées
disons que le table 'contact' contient des utilisateur
et le table 'telephone' contient des numero de téléphone ainsi que le le
type de telephone ('PRO', 'PERSO', 'MOBILE')

j'ai besoin de connaitre pour chaque utilisateur combien il a de numéro
'PRO'
donc je fais
SELECT iduser, count(t.idtel) FROM user AS u LEFT OUTER JOIN telephone AS t
ON u.idctc = t.idctc WHERE t.typetel LIKE 'PRO';

sauf que la, j'ai jamais 0 !!!

donc j'ai mis
SELECT iduser, count(t.idtel) FROM user AS u LEFT OUTER JOIN telephone AS t
ON u.idctc = t.idctc WHERE t.typetel LIKE 'PRO' OR t.typetel IS NULL;

mais bon... ca me dérange un peu, car je peux pas etre sur qu'il n'existe
pas un numero de téléphone ayant un type non défini et donc comptabiliser
dans ma requete...

Donc comment faire ma requette pour que ca compte les numero de telephone
'PRO' et uniquement ceux la.

merci
Etienne



Bonjour,

1°) Une description de la table et des colonnes aurait été bien...

2°) Pourquoi LIKE ?

SELECT iduser,
( SELECT Count(*)
FROM telephone
WHERE idctc = u.idctc
AND typetel = 'PRO' ) AS NbTelPro
FROM users u

--
Philippe.
Avatar
Ph. B.
Stéphane wrote:

"Etienne SOBOLE" a écrit:

Salut.

j'ai deux table qui sont liées
disons que le table 'contact' contient des utilisateur
et le table 'telephone' contient des numero de téléphone ainsi que le le
type de telephone ('PRO', 'PERSO', 'MOBILE')

j'ai besoin de connaitre pour chaque utilisateur combien il a de numéro
'PRO'
donc je fais
SELECT iduser, count(t.idtel) FROM user AS u LEFT OUTER JOIN telephone AS t
ON u.idctc = t.idctc WHERE t.typetel LIKE 'PRO';

sauf que la, j'ai jamais 0 !!!




Essaie avec INNER JOIN



NON, car Etienne veut aussi que la jointure lui renvoie les utilisateurs sans
téléphone pro ! INNER JOIN ne renvoie que les éléments qui ont une corespondance !

SELECT iduser, count(t.idtel)
FROM user u
INNER JOIN telephone t ON u.idctc = t.idctc
WHERE t.typetel LIKE 'PRO';



En plus, il manque la clause de regroupement permettant à la fonction
d'aggrégation d'opérer, le paramètre suivant LIKE est incomplet ou/et mal appliqué.
< t.typetel LIKE 'PRO' > est beaucoup moins efficace que < t.typetel = 'PRO' >

SELECT u.iduser, count(t.idtel)
FROM user u
INNER JOIN telephone t ON t.idctc = u.idctc
WHERE t.typetel LIKE 'PRO%'
GROUP BY u.iduser

Stéphane
La souplesse d'esprit permet de s'adapter dans toutes circonstances.

http://www.velo-passion.com pour les fans de vélo
http://www.lorimier.com/chemin-des-cretes-du-jura une ballade à pied d'une semaine à 2
http://www.baby-boum.ch l'enfant n'est-il pas l'avenir de l'homme?



--
Philippe.
Avatar
Etienne SOBOLE
"Ph. B." a écrit dans le message
de news: 40f2b53c$0$25752$
1°) Une description de la table et des colonnes aurait été bien...



Ben mes tables seraient un truc du genre

CREATE TABLE "contact" (
"idcontact" integer DEFAULT nextval('"seq_contact"'::text) NOT NULL,
"nom" text,
"prenom" text,
PRIMARY key (idcontact)
);

CREATE TABLE "telephone" (
"idtel" integer DEFAULT nextval('"seq_tel"'::text) NOT NULL,
"teltype" varchar(8),
"numero" varchar(16),
PRIMARY key (idtel)
);

CREATE TABLE "affect_tel" (
"idcontact" integer NOT NULL,
"idtel" integer NOT NULL,
PRIMARY key (idcontact, idtel)
foreign key (idcontact) REFERENCES contact(idcontact),
foreign key (idtel) REFERENCES telephone(idtel)
);

voila bon j'ai du un peu simplifier parce que a la base c'est pas une
histoire de contact et de telephone.

2°) Pourquoi LIKE ?

SELECT iduser,
( SELECT Count(*)
FROM telephone
WHERE idctc = u.idctc
AND typetel = 'PRO' ) AS NbTelPro
FROM users u



Bon ben je vais essayer. ton truc.
merci.

Etienne
Avatar
Antoine Dinimant
...
sauf que la, j'ai jamais 0 !!!

donc j'ai mis
SELECT iduser, count(t.idtel) FROM user AS u LEFT OUTER JOIN telephone AS t
ON u.idctc = t.idctc WHERE t.typetel LIKE 'PRO' OR t.typetel IS NULL;

mais bon... ca me dérange un peu, car je peux pas etre sur qu'il n'existe
pas un numero de téléphone ayant un type non défini et donc comptabiliser
dans ma requete...

Donc comment faire ma requette pour que ca compte les numero de telephone
'PRO' et uniquement ceux la.



que dirais-tu de :

...ON u.idctc = t.idctc
WHERE t.typetel = 'PRO' OR t.idctc IS NULL;

comme ça, le typetel NULL n'est autorisé que s'il est vraiment dû à la
jointure ouverte.
Avatar
Etienne SOBOLE
"Antoine Dinimant" a écrit dans le message de news:


En un mot:
Genial.
ca marche nickel.

merci
Etienne

que dirais-tu de :
...ON u.idctc = t.idctc
WHERE t.typetel = 'PRO' OR t.idctc IS NULL;

comme ça, le typetel NULL n'est autorisé que s'il est vraiment dû à la
jointure ouverte.