Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/02/2011, 22h00   #1
Invité de passage
 
Inscription : février 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 14
Points : 0
Points : 0
Par défaut Problème avec fonction count si 0

Bonjour,

Ma requête suivante :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT c.customers_gender, c.customers_firstname, 
  c.customers_lastname, c.customers_dob, c.customers_email_address, 
  ci.customers_info_date_of_last_logon, 
  count(o.orders_id) NbCommande, 
  sum(ot.value) TotalCommande, 
  max(o.date_purchased) DerniereCommande
 
FROM customers_info ci, customers c
 
RIGHT JOIN (orders_total ot, orders o) 
  ON (ot.class ='ot_total' 
    AND ot.orders_id = o.orders_id 
    AND c.customers_id = o.customers_id)
 
WHERE c.customers_newsletter=1 
  AND c.customers_id = ci.customers_info_id
 
GROUP BY c.customers_gender, c.customers_firstname, c.customers_lastname, c.customers_dob, c.customers_email_address

ne me retourne pas de résultats pour toutes mes lignes ou mon count(o.orders_id) = 0.

Je pense que mon pb vient de la syntaxe de ma jointure.

Je tourne en rond depuis plusieurs heures. Si quelqu'un à une idée, je suis preneur.

Merci :-)
biboulie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 22h22   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par biboulie Voir le message
Je pense que mon pb vient de la syntaxe de ma jointure.
C'est sûr qu'en mélangeant la vielle syntaxe obsolète depuis 1992 et la syntaxe normalisée depuis 18 ans, tu peux t'emmêler les doigts !

En plus tu essaies de faire deux jointures externes en une seule et tu as aussi oublié une colonne dans le GROUP BY.

Essaie comme ça :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT c.customers_gender, c.customers_firstname, 
  c.customers_lastname, c.customers_dob, c.customers_email_address, 
  ci.customers_info_date_of_last_logon, 
  COALESCE(COUNT(o.orders_id), 0) NbCommande, 
  COALESCE(SUM(ot.value), 0) TotalCommande, 
  MAX(o.date_purchased) DerniereCommande
FROM customers c
INNER JOIN customers_info ci ON c.customers_id = ci.customers_info_id
LEFT OUTER JOIN orders o ON c.customers_id = o.customers_id
  LEFT OUTER JOIN orders_total ot 
    ON ot.orders_id = o.orders_id
    AND ot.class ='ot_total'
WHERE c.customers_newsletter = 1
GROUP BY c.customers_gender, c.customers_firstname, c.customers_lastname, 
  c.customers_dob, c.customers_email_address, ci.customers_info_date_of_last_logon
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 22h41   #3
Invité de passage
 
Inscription : février 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 14
Points : 0
Points : 0
Bon ben déjà ma requête sera plus propre, merci

Cela dit, la requête que tu m'as donné tourne en boucle.

Bizarre, ça fait 10 minutes quelle tourne sans me retourner de résultats !
biboulie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 22h43   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
Tes tables sont indexées ?

J'ai construit les jointures sur l'hypothèse qu'il peut y avoir des customers sans orders et pas l'inverse.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 22h48   #5
Invité de passage
 
Inscription : février 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 14
Points : 0
Points : 0
Oui il peut y avoir des customers sans orders mais pas l'inverse !
(sauf effacement par erreur)

Bizarre !
biboulie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 22h49   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
Bis repetita :
Citation:
Tes tables sont indexées ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 22h55   #7
Invité de passage
 
Inscription : février 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 14
Points : 0
Points : 0
Désolé.

Oui mes tables sont bien indexées.

Dans customers j'ai customers_id (repris également dans orders) et dans orders j'ai un orders_id.

C'est ce que tu veux savoir ?
biboulie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 23h36   #8
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
Il y a 4 tables dans la requête et tu ne m'en cites que 2 !

Il faut que toutes les colonnes figurant dans les conditions de jointure (après les ON) soient indexées, ainsi probablement que la colonne orders_total.class puisque tu fais une restriction dessus.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2011, 09h04   #9
Invité de passage
 
Inscription : février 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 14
Points : 0
Points : 0
Je reprends, j'ai :

Table customers : cusomers_id

Table customers_info : customers_info_id

Table orders : orders_id (reliée avec customers_id)

Table orders_total : orders_total_id (reliée avec orders_id)


Je ne suis vraiment pas un pro en sql donc je tâtonne...
biboulie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2011, 10h04   #10
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
Je le sais que tu as ces tables ; elles sont dans la requête !

Regarde ma requête et met un index sur toutes les colonnes qui figurent derrière les ON.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/02/2011, 10h09   #11
Invité de passage
 
Inscription : février 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 14
Points : 0
Points : 0
Euh ça dépasse mes faibles compétences.

Mettre un index c'est à dire ?

biboulie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2011, 00h12   #12
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
Quel est ton SGBD ? Quel logiciel utilises-tu pour lancer ta requête ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2011, 09h16   #13
Invité de passage
 
Inscription : février 2011
Messages : 14
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 14
Points : 0
Points : 0
J'utilise PhpMyAdmin

biboulie est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h56.


 
 
 
 
Partenaires

Hébergement Web