IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

ORDER BY complexe [MySQL-5.0]


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut ORDER BY complexe
    Bonjour,

    Voici la description de mon problème :

    J'ai une table "clients" sur laquelle je fais des extractions plus ou moins complexes (JOIN + UNION).
    Jusque-là pas de problème.

    Cette table est liée par son id à d'autres tables "achat" ex achat_meubles, achat_chaises etc...

    Mon problème est que je dois trier mes clients suivant le maximum de leur achats sur la totalité des tables achats.
    En résumé les meilleurs acheteurs apparaissent en premier.

    Merci pour votre aide !!!

  2. #2
    Membre averti Avatar de camyo
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2004
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2004
    Messages : 400
    Points : 386
    Points
    386
    Par défaut
    Bonjour,
    Je crois que tu devrais montrer déjà un peu de ce que tu as fait ..
    Et la structure ( simplifiée ) des tables..

    Car là, personne ne pourra t'aider avec les infos que tu donnes.
    Quand une réponse vous aide
    Et quand ça marche

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    bon si tu le dis !

    table : clients
    champs : idC nom adresse ...

    plusieurs tables achat... (différent nombre de colonnes mais 3 champs identiques)

    ex :
    table : achat_meubles
    champs : id idC prix

    table : achat_chaises
    champs : id idC prix

    Voila c'est plus clair ?
    Mon problème est que je dois trier mes clients suivant le maximum de leur achats sur la totalité des tables achats.
    En résumé les meilleurs clients apparaissent en premier.

  4. #4
    Membre averti Avatar de camyo
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2004
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2004
    Messages : 400
    Points : 386
    Points
    386
    Par défaut
    Je dis peut-être une bêtise, mais je pense qu'un truc comme ça pourrait marcher ... À optimiser !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT
        (SELECT SUM(`prix`) FROM `achat_meubles` WHERE achat_meubles.idC = Clients.idC)
        +
        (SELECT SUM(`prix`) FROM ` achat_chaises` WHERE achat_chaises.idC= Clients.idC)
    AS `total_achats`
    FROM Clients, achat_meubles, achat_chaises
    ORDER BY `total_achats` ASC
    Quand une réponse vous aide
    Et quand ça marche

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Merci camyo je vais tester ça !

  6. #6
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    C'est cool merci... mais subsiste un problème que je n'arrive pas à résoudre !!!

    Voici la requête simplifiée optimisée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    $query_best_client ="
    		SELECT DISTINCT(officiel.idO) ,
    		((SELECT SUM(tarif_pub) FROM infos_evenement WHERE infos_evenement.idO = officiel.idO)
    		+
    		(SELECT SUM(tarif_pub) FROM infos_gala WHERE  infos_gala.idO = officiel.idO))
    		AS total_pub		
    		FROM officiel, infos_evenement, infos_gala		
    		ORDER BY total_pub DESC , nomInsti DESC
    		";
    Or cela ne fonctionne que si les 2 sous SELECT renvoient une valeur !

    Vraiment incompréhensible... quoi que ... un nombre + rien = rien pour MySql semble-t-il

  7. #7
    Membre averti Avatar de camyo
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2004
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Juin 2004
    Messages : 400
    Points : 386
    Points
    386
    Par défaut
    Regarde de ce côté-là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT IFNULL(SUM(prix), 0) AS total FROM...
     
    SELECT COALESCE(SUM(prix), 0) AS total FROM...
    Quand une réponse vous aide
    Et quand ça marche

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par patk777 Voir le message
    vraiment incompréhensible... quoi que ... un nombre + rien = rien pour MySql semble t'il
    En effet, et pour tous les SGBDR !
    En fait, ce n'est pas "un nombre + rien", c'est "un nombre + NULL".
    Si on devait le traduire en langage courant, ça se rapprocherait plus de "un nombre + une valeur inconnue", ce qui donne en effet... une valeur inconnue.

    A part ça, vous avez un problème de modélisation, car vous ne devriez pas avoir une table par type de produit acheté. Ou alors (éventuellement en cas d'héritage) avoir une table commune (mère) dans laquelle se situerait notamment le prix.
    Ainsi, votre requête s'en serait trouvée grandement simplifiée.


    Par ailleurs, je ne comprend pas la présence de toutes vos tables dans la clause FROM, surtout qu'il n'y a aucune condition de jointure... Vous allez donc obtenir un produit cartésien. Je ne pense pas que c'est ce que vous voulez (A part si vous cherchez à valoriser votre entreprise par un chiffre d'affaire astronomique...)

    Afin de mieux masquer votre problème de modélisation (et de résoudre au passage vos problème de sommes à NULL), j'aurais plutôt fait ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT
        id0, SUM(tarif_pub)
    FROM (
        SELECT id0, tarif_pub
        FROM infos_evenement 
        UNION ALL
        SELECT id0, tarif_pub
        FROM infos_gala 
     
    ) I
    GROUP BY id0

  9. #9
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Yes ça le fait...

    suis vraiment une brêle ... je connaissais même pas ça !!!
    http://dev.mysql.com/doc/refman/5.0/...functions.html

    tu viens de m'ouvrir une porte...encore merci

  10. #10
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    A part ça, vous avez un problème de modélisation, car vous ne devriez pas avoir une table par type de produit acheté.
    [/code]
    Merci pour la réponse mais il ne s'agit pas de produits physiques qui ont les mêmes caractéristiques (champs), j'ai simplifié ma question pour le forum
    j'ai été obligé de réaliser plusieurs tables "produits" donc la modélisation est bonne.

    Je vais tester votre solution

  11. #11
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    la solution de aieeeuuuuu !!!

    me renvoie l'erreur MySql : Every derived table must have its own alias

  12. #12
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par patk777 Voir le message
    j'ai été obligé de réaliser plusieurs tables "produits" donc la modélisation est bonne.
    Non, dans ce cas, vous auriez dû mettre en place de l'héritage avec en gros :

    - Les colonnes communes dans une table mère
    - Les colonnes spécifiques dans des tables filles, dont la clef primaire est également une clef étrangère référençant la table mère.

    Votre requête serait alors simplement devenue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT id0, SUM(info)
    FROM LaTableMEre
    GROUP BY id0
    Plus simple, non ?

  13. #13
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    C'est clair... "diviser" les tables pour simplifier les requêtes non prévues au départ !!! Un peu tard pour moi à ce stade d'avancement !
    Je ne l'oublierai pas pour les prochaines fois !

  14. #14
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par patk777 Voir le message
    la solution de aieeeuuuuu !!!

    me renvoie l'erreur MySql : Every derived table must have its own alias
    Vous avez dû oublier l'alias de table (en l'occurence 'I') en recopiant la requête.

    Pour plus de lisibilite, vous pouvez ajouter le mot clef AS devant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    SELECT
        id0, SUM(tarif_pub)
    FROM (
        SELECT id0, tarif_pub
        FROM infos_evenement 
        UNION ALL
        SELECT id0, tarif_pub
        FROM infos_gala 
     
    ) AS I
    GROUP BY id0

  15. #15
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    bonjour aieeeuuuuu et camyo

    Désolé de vous solliciter à nouveau mais j'ai un problème incompréhensible et pas logique du tout !

    Bon la bonne nouvelle c'est que toutes mes requêtes fonctionnent parfaitement !

    J'ai juste un petit souci de classement,
    résultat(simplifié) de la requête ci-dessous
    id total_pub
    1913 : 182
    1909 : 26
    125 : 0
    212 : 0
    etc... le classement se fait bien ensuite par ordre alphabétique

    cette requête fonctionne parfaitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    SELECT DISTINCT(officiel.idO) as id, 
    (SELECT IFNULL(SUM(infos_evenement.tarif_pub), 0) FROM infos_evenement WHERE infos_evenement.idO = officiel.idO AND infos_evenement.visible = '1') 
    + 
    (SELECT IFNULL(SUM(infos_gala.tarif_pub), 0) FROM infos_gala WHERE infos_gala.idO = officiel.idO AND infos_gala.visible = '1') 
    + 
    (SELECT IFNULL(SUM(infos_gan.tarif_pub), 0) FROM infos_gan WHERE infos_gan.idO = officiel.idO AND infos_gan.visible = '1') 
    + 
    (SELECT IFNULL(SUM(infos_location.tarif_pub), 0) FROM infos_location WHERE infos_location.idO = officiel.idO AND infos_location.visible = '1') 
    + 
    (SELECT IFNULL(SUM(infos_repas.tarif_pub), 0) FROM infos_repas WHERE infos_repas.idO = officiel.idO AND infos_repas.visible = '1') AS total_pub, 
    pseudoO as pseudo, officiel.dateCrea as dateCrea, respO as resp, officiel.nomInsti as nomInsti, adrO as adr, officiel.ville as ville, cpO as cp, paysO as pays, telO as tel, faxO as fax, mailO as mail, siteO as site, officiel.type as type, officiel.commentaire as comm, heureCO as heureC, minCO as minC, heureMO as heureM, minMO as minM, heureAO as heureA, minAO as minA, 0.1, photoInstiO as photo, '' as dateDu, '' as dateAu, '' as datePour, str_to_date(officiel.dateCrea, '%d-%m-%Y') as dateTri_fmtdate, riteO as rite 
    FROM officiel 
    WHERE paysO LIKE '%France%' and officiel.ville LIKE '%Paris%' 
    ORDER BY total_pub DESC , nomInsti ASC
    Or dès que je fais un UNON avec une autre requête, le classement se fait différemment.
    id total_pub
    1909 : 26
    1913 : 182
    125 : 0
    212 : 0
    etc... le classement se fait bien ensuite par ordre alphabétique

    C'est subtil tout ça !!!
    Auriez-vous une idée svp ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    SELECT idP as id,
    '' AS total_pub, 
    pseudoP as pseudo, particulier.dateCrea as dateCrea, responsable as resp, '' as nomInsti, adresse as adr, particulier.ville as ville, cp as cp, paysP as pays, tel as tel, '' as fax, mail as mail, '' as site, particulier.type as type, particulier.commentaire as comm, hChaharit as heureC, mChaharit as minC, hMinha as heureM, mMinha as minM, hArvit as heureA, mArvit as minA, 0.1 as inconnu, photoLieu as photo, dateDu as dateDu, dateAu as dateAu, datePour as datePour, str_to_date(particulier.dateCrea, '%d-%m-%Y') as dateTri_fmtdate, rite as rite 
    FROM particulier 
    WHERE paysP LIKE '%France%' and particulier.ville LIKE '%Paris%' AND (('2014-06-26' BETWEEN dateDu AND dateAu) OR datePour='2014-06-26') 
     
    UNION 
     
    // ici exactement la même requete que ci-dessus
    SELECT DISTINCT(officiel.idO) as id, 
    (SELECT IFNULL(SUM(infos_evenement.tarif_pub), 0) FROM infos_evenement WHERE infos_evenement.idO = officiel.idO AND infos_evenement.visible = '1') 
    + 
    (SELECT IFNULL(SUM(infos_gala.tarif_pub), 0) FROM infos_gala WHERE infos_gala.idO = officiel.idO AND infos_gala.visible = '1') 
    + 
    (SELECT IFNULL(SUM(infos_gan.tarif_pub), 0) FROM infos_gan WHERE infos_gan.idO = officiel.idO AND infos_gan.visible = '1') 
    + 
    (SELECT IFNULL(SUM(infos_location.tarif_pub), 0) FROM infos_location WHERE infos_location.idO = officiel.idO AND infos_location.visible = '1') 
    + 
    (SELECT IFNULL(SUM(infos_repas.tarif_pub), 0) FROM infos_repas WHERE infos_repas.idO = officiel.idO AND infos_repas.visible = '1') 
    AS total_pub, 
    pseudoO as pseudo, officiel.dateCrea as dateCrea, respO as resp, officiel.nomInsti as nomInsti, adrO as adr, officiel.ville as ville, cpO as cp, paysO as pays, telO as tel, faxO as fax, mailO as mail, siteO as site, officiel.type as type, officiel.commentaire as comm, heureCO as heureC, minCO as minC, heureMO as heureM, minMO as minM, heureAO as heureA, minAO as minA, 0.1, photoInstiO as photo, '' as dateDu, '' as dateAu, '' as datePour, str_to_date(officiel.dateCrea, '%d-%m-%Y') as dateTri_fmtdate, riteO as rite 
    FROM officiel 
    WHERE paysO LIKE '%France%' and officiel.ville LIKE '%Paris%' 
    ORDER BY total_pub DESC , nomInsti ASC

  16. #16
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    En faisant ceci : '' AS total_pub,, la colonne total_pub et de type caractère, d'où le classement par ordre alphabétique.
    (Les sommes de la deuxième requête sont transtypées vers du caractère également)
    Dans votre première requête, spécifiez explicitement une colonne de type numérique

  17. #17
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    cool !!! merci aieeeuuuuu

    la solution pour ceux que ça intéressent :

    CAST (votre valeur AS UNSIGNED)

    tout ici : Fonctions de transtypage
    http://dev.mysql.com/doc/refman/5.0/...functions.html

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. SQL, ORDER BY assez complexe
    Par FtF Nemesis dans le forum VBA Access
    Réponses: 8
    Dernier message: 24/05/2011, 15h33
  2. order by assez complexe (pour moi en tout cas :) )
    Par eldrad95 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 07/12/2009, 11h03
  3. ORDER BY complexe
    Par pekka77 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 03/10/2006, 11h33
  4. Réponses: 7
    Dernier message: 07/04/2003, 09h35
  5. ORDER BY dans un ordre inhabituel
    Par Riam dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 21/03/2003, 13h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo