MYSQL Select

Résolu/Fermé
florent.perret.74 Messages postés 25 Date d'inscription mardi 17 juillet 2012 Statut Membre Dernière intervention 11 octobre 2012 - 14 sept. 2012 à 11:58
florent.perret.74 Messages postés 25 Date d'inscription mardi 17 juillet 2012 Statut Membre Dernière intervention 11 octobre 2012 - 1 oct. 2012 à 17:39
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 mardi 7 juin 2011 Statut Membre Dernière intervention 24 mai 2015 350
28 sept. 2012 à 10:10
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 278 Date d'inscription samedi 10 juin 2006 Statut Contributeur Dernière intervention 29 juin 2016 16
14 sept. 2012 à 15:01
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 mardi 17 juillet 2012 Statut Membre Dernière intervention 11 octobre 2012
27 sept. 2012 à 15:32
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 278 Date d'inscription samedi 10 juin 2006 Statut Contributeur Dernière intervention 29 juin 2016 16
27 sept. 2012 à 17:42
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 mardi 17 juillet 2012 Statut Membre Dernière intervention 11 octobre 2012
28 sept. 2012 à 09:37
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 mardi 17 juillet 2012 Statut Membre Dernière intervention 11 octobre 2012
28 sept. 2012 à 10:37
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 278 Date d'inscription samedi 10 juin 2006 Statut Contributeur Dernière intervention 29 juin 2016 16
1 oct. 2012 à 14:38
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 mardi 17 juillet 2012 Statut Membre Dernière intervention 11 octobre 2012
1 oct. 2012 à 15:02
D'accord, merci du conseil :) !
0
maka54 Messages postés 699 Date d'inscription mercredi 8 avril 2009 Statut Membre Dernière intervention 4 décembre 2016 80
1 oct. 2012 à 16:44
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 mardi 17 juillet 2012 Statut Membre Dernière intervention 11 octobre 2012
1 oct. 2012 à 17:39
Niquel ça marche ! Le fameux GROUP BY ! Merci beaucoup à vous deux !
0