SQL : problème pour écrire une requête (un peu) complexe

muqaddarmuqaddar Administrateur
13:02 modifié dans Actualités #1
Salut les gens,

J'en appelle aux cracks de MySQL.
Je n'arrive pas à  avoir ce que je veux lors d'une requête.

Soit 5 tables : wines, countries, regions, stocks, wineships.

Il s'agit de récupérer le total des vins par région et la somme des stocks de chaque vin
+ 2 champs existants.

Voilà  ma requête actuelle :

SELECT r.name, c.flag, count(distinct w.id) AS total_wines, sum(s.instock) AS somme_stocks <br />FROM wines w, countries c, regions r, wineships ws, stocks s <br />WHERE ws.member_id = 1 <br />AND w.id = ws.wine_id <br />AND r.country_id = c.id <br />AND w.region_id = r.id <br />AND s.wine_id = w.id <br />GROUP BY w.region_id <br />ORDER BY total_wines DESC <br />LIMIT 10


Ce qui me donne :

Bordeaux  France.gif  1  11
Bourgogne France.gif 1 5
Lombardia Italy.gif 1   6

Si les stocks sont bons (dernière colonne), le total ne l'est pas.
Or, le total était bon lorsque je ne m'occupais pas de la somme des stocks...

Une idée ?

Réponses

  • schlumschlum Membre
    mai 2007 modifié #2
    J'ai essayé la simplification à  deux tables chez moi sur PHPMyAdmin :
    SELECT w.region_id, COUNT( DISTINCT w.id ) AS total_wines, SUM( s.instock ) AS somme_stocks<br />FROM wines w, stocks s<br />WHERE s.wine_id = w.id<br />GROUP BY w.region_id
    


    Et ça fonctionne très bien...

    Nota : ici, tu limites ta requête aux commandes d'un client (celui d'ID 1) ; es-tu sûr que tu as plusieurs types de vins pour chaque région commandé par ce client ?
  • muqaddarmuqaddar Administrateur
    13:02 modifié #3
    J'ai testé ton code et j'ai le même résultat que le mien... les totaux sont faux. :-(

    Il y a plusieurs vins par région mais je ne veux QUE les régions où le membre (client) a des vins.
  • schlumschlum Membre
    13:02 modifié #4
    Et si au lieu de faire un "GROUP BY", tu fais un "ORDER BY" (en enlevant également COUNT et SUM), tu as bien tous les enregistrements voulus dans la liste ?
  • muqaddarmuqaddar Administrateur
    13:02 modifié #5
    dans 1178201980:

    Et si au lieu de faire un "GROUP BY", tu fais un "ORDER BY" (en enlevant également COUNT et SUM), tu as bien tous les enregistrements voulus dans la liste ?


    J'ai besoin du GROUP BY pour ne pas dupliquer les régions... :)
  • LeChatNoirLeChatNoir Membre, Modérateur
    mai 2007 modifié #6
    Je crois que Schlum voulais juste que tu vérifies le résultat sans l'agrégation (oomptage manuel pour s'assurer que les résultats que tu attends sont les bons).

    Si tu pouvais juste nous montrer le contenu de tes tables (juste un extrait sur un client par ex), ca m'aiderait à  t'aider :-)
  • schlumschlum Membre
    13:02 modifié #7
    dans 1178213623:

    dans 1178201980:

    Et si au lieu de faire un "GROUP BY", tu fais un "ORDER BY" (en enlevant également COUNT et SUM), tu as bien tous les enregistrements voulus dans la liste ?


    J'ai besoin du GROUP BY pour ne pas dupliquer les régions... :)


    Oui, je sais bien, mais c'était une requête test, pour voir si ça foire au niveau du "GROUP BY" ou avant  :P
  • muqaddarmuqaddar Administrateur
    13:02 modifié #8
    Voilà  le contenu de mes tables "essentiel" pour la requête :

    wines
    - id
    - region_id

    wineships (jointure)
    - wine_id
    - member_id

    stocks
    - id
    - wine_id

    regions
    - id
    - country_id

    members
    - id
    - lastname

    countries
    - id
    - flag

    Voilà  si ça peut aider... merci les gars ! ;-)

    ps : sans le group by, il manque une région... les résultats sont erronés.
  • schlumschlum Membre
    13:02 modifié #9
    Enlève le "LIMIT"  :P
    Est-ce que sans le GROUP BY, tu vois bien plusieurs entrées par régions ?
  • muqaddarmuqaddar Administrateur
    13:02 modifié #10
    dans 1178222505:

    Enlève le "LIMIT"  :P
    Est-ce que sans le GROUP BY, tu vois bien plusieurs entrées par régions ?


    Oui, je confirme.
Connectez-vous ou Inscrivez-vous pour répondre.