MYSQL Select

Résolu
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

  1. Contributeur
    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...
    1. 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...
      1. Contributeur
        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
        1. 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 !
          1. 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. 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 !
              1. Contributeur
                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.
              2. D'accord, merci du conseil :) !
              3. 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 
              4. Niquel ça marche ! Le fameux GROUP BY ! Merci beaucoup à vous deux !