MYSQL Select

Résolu
florent.perret.74 Messages postés 25 Date d'inscription   Statut Membre Dernière intervention   -  
florent.perret.74 Messages postés 25 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour à tous,

J'ai créer un listing de tous mes clients avec la requete SQL suivant :

SELECT * FROM client

Ensuite dans une boucle en PHP, je fais encore deux requêtes pour lister mon nombre de devis par client et le nombre de commande :

SELECT count(dev_id_devis) as nb_devis FROM devis t1 WHERE cli_id_client= '$client' GROUP BY cli_id_client

idem pour les commandes.

Ma question est la suivante : Est-il possible de réunir les 3 requêtes en une seule ?

Ex:

SELECT cli_raison_sociale, (SELECT count(dev_id_devis)
FROM devis t1
) as nb_devis,

(SELECT count(cmd_id_commande)
FROM commande t2
) as nb_commande
FROM client
ORDER BY cli_raison_sociale



Je pense que je suis pas loin de la solution si c'est possible....

Merci à tous...

Florent PERRET

6 réponses

laoshu Messages postés 1231 Date d'inscription   Statut Membre Dernière intervention   351
 
Bonjour,

Ce n'est pas très propre, mais tu peux essayer ainsi (si tu n'as pas mieux):

SELECT cli_raison_sociale, dev_id_devis
FROM client c1 JOIN devis t1
WHERE t1.dev_id_client = c1.cli_id_client
ORDER BY cli_raison_sociale

Et faire une boucle php sur le résultat pour compter, en mettant le résultat dans une variable.

Et recommencer pour les commandes. Ça te fait 2 requêtes contre une attendue, mais je ne trouve pas mieux...
1
kalamit Messages postés 279 Date d'inscription   Statut Contributeur Dernière intervention   16
 
Salut,

Effectivement, c'est une très mauvaise idées de faire des requêtes dans des boucles et un bon réflexe de tout réunir en une requête.

A quoi te sert ton select dans la table client du début sans condition where ?

Parce que pour moi, tu peux faire directement un :

SELECT count(dev_id_devis) as nb_devis FROM devis t1 GROUP BY cli_id_client

et idem sur les commandes...
0
florent.perret.74 Messages postés 25 Date d'inscription   Statut Membre Dernière intervention  
 
Salut,

Désolé pour cette réponse ultra-tardive... :/ Alors la requête du début permet de lister tous les clients de la base de données avec leurs coordonnées respectives (N° tel, adresse, fax...) c'est une sorte d'annuaire. Et ensuite, pour un usage commercial, ils m'ont demandé de regrouper dans deux nouvelles colonnes le nombre de devis effectués pour le client ainsi que le nombre de commandes...
0
kalamit Messages postés 279 Date d'inscription   Statut Contributeur Dernière intervention   16
 
Ok, je percute et je dirais :

SELECT cli_raison_sociale, COUNT(dev_id_devis) as nb_devis, COUNT(cmd_id_commande) as nb_commande
FROM client c1
LEFT OUTER JOIN devis t1 on t1.dev_id_client = c1.cli_id_client
LEFT OUTER JOIN commande t2 on t2.cmd_id_client = c1.cli_id_client
ORDER BY cli_raison_sociale

J'extrapole sur les id de jointure, étant donné que je n'ai pas la description de toutes les tables. Je dois pas être loin.

Bonne journée
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
florent.perret.74 Messages postés 25 Date d'inscription   Statut Membre Dernière intervention  
 
En effet, vous n'êtes pas loin sur le sujet. Mais je n'ai pas l'impression que ça soit possible... En effet, lorsque j'exécute votre requête, il n'y a qu'une ligne :

- ce dernier me renvoie le total des devis dans la base et
- le total des commandes,
- Le premier client qu'il trouve...


Du coup le résultat n'est plus exploitable... Mais bon, ça n'est peut être pas possible ce que je demande... En tout cas merci beaucoup !
0
florent.perret.74 Messages postés 25 Date d'inscription   Statut Membre Dernière intervention  
 
Du coup, c'est ce que j'ai fait... C'est pour ça que c'est un peu lourd mais au moins ils obtiennent le résultat qu'ils voulaient... L'autre idée n'était peut être pas réalisable... Merci beaucoup quand même !
0
kalamit Messages postés 279 Date d'inscription   Statut Contributeur Dernière intervention   16
 
Si si l'autre idée est réalisable, c'est juste la jointure qui est inversée. Il faut certainement prendre le pb à l'envers.
Je te conseille tout de meme de revoir la requete, car ta solution de requete imbriquée est diffcilement viable dans le temps.
0
florent.perret.74 Messages postés 25 Date d'inscription   Statut Membre Dernière intervention  
 
D'accord, merci du conseil :) !
0
maka54 Messages postés 698 Date d'inscription   Statut Membre Dernière intervention   80
 
la requete de kalamit est correcte, mais il manque le group by : "par structure"


SELECT cli_raison_sociale, COUNT(dev_id_devis) as nb_devis, COUNT(cmd_id_commande) as nb_commande
FROM client c1
LEFT OUTER JOIN devis t1 on t1.dev_id_client = c1.cli_id_client
LEFT OUTER JOIN commande t2 on t2.cmd_id_client = c1.cli_id_client
GROUP BY c1.cli_id_client
ORDER BY cli_raison_sociale 
0
florent.perret.74 Messages postés 25 Date d'inscription   Statut Membre Dernière intervention  
 
Niquel ça marche ! Le fameux GROUP BY ! Merci beaucoup à vous deux !
0