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 :

Faire un GROUP BY dans un ORDER BY FIELD ou autre solution si vous etes super fort ! :)


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 3
    Points : 2
    Points
    2
    Par défaut Faire un GROUP BY dans un ORDER BY FIELD ou autre solution si vous etes super fort ! :)
    Bonjour,
    Ca fait déjà plusieurs heures que j'essaie de construire une requête et je n'arrive pas à récupérer les bonnes valeurs
    J'ai donc besoin d'un besoin d'aide si possible.
    Voilà j'ai une table mysql livres avec les données suivantes :
    livre 1 en
    livre 1 fr
    livre 2 it
    livre 1 it
    livre 3 fr

    J'essaye de faire une requete qui me renvoie les livres 1, 2 et 3 avec une langue de "préférence".
    Si la langue de préférence n'existe pas, l'anglais doit etre choisis, sinon s'il n'existe pas non plus ça récupère le livre en italien, et ainsi de suite.
    Toutes les livres n'existent pas forcément dans toutes les langues.
    Dans mon exemple je voudrais récupérer cela : (ma langue de préférence est francais, puis anglais, puis italien)
    livre 1 fr
    livre 2 it
    livre 3 fr

    J'ai essayé avec ORDER BY FIELD(langue, "fr", "en", "it") mais ça me renvoie
    livre 1 fr
    livre 1 en
    livre 1 it
    livre 2 it
    livre 3 fr

    Le problème est que le livre 1 est renvoyé 3 fois. Et le problème ne se règle pas avec un GROUP BY car il est exécuté avant le tri.

  2. #2
    Membre averti Avatar de Nheo_
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2011
    Messages : 323
    Points : 416
    Points
    416
    Par défaut
    Bonjour,

    Voici une requête qui fonctionne. Ce n'est pas très propre, mais ça peut te dépanner :
    (j'ai supposé que ta table s’appelait 'livres' et les champs 'nom' et 'prix')

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * FROM
    (SELECT nom,langue FROM livres 
    ORDER BY FIELD(nom, langue, "fr", "en", "it")) t 
    GROUP BY t.nom

  3. #3
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Si cette requête donne le résultat attendu, c'est un pur coup de chance...
    En effet,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * ... GROUP BY t.nom
    ne peut pas donner le résultat attendu (voir le tutoriel suivant : http://cedric-duprez.developpez.com/...fier-group-by/).

    Essaie plutôt la requête suivante, qui a plus de chance de donner à tous les coups le résultat attendu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT nom, langue
    FROM livres l
    WHERE (
    	SELECT COUNT(*)
    	FROM livres l2
    	WHERE l.nom = l2.nom
    	AND CASE WHEN l2.langue = 'fr' THEN 1 WHEN l2.langue = 'en' THEN '2' WHEN l2.langue = 'it' THEN 3 END 
    		< CASE WHEN l.langue = 'fr' THEN 1 WHEN l.langue = 'en' THEN '2' WHEN l.langue = 'it' THEN 3 END
    ) < 1
    ORDER BY nom;
    Attention, plus il y a de langages à prendre en compte et plus il faudra développer le WHERE de la sous-requête, en respectant les alias "l" et "l2".

    ced

  4. #4
    Candidat au Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    J'ai tenté la solution de Nheo_ et ça fonctionne, mais je comprends bien que le résultat n'est pas fiable.
    Donc je vais essayer de changer et d'utiliser CASE (que je n'ai jamais utilisé et dont j'ignore le fonctionnement :p donc go google. Mais si quelqu'un a un bon tutoriel dessus je suis preneuse).
    Merci beaucoup pour vos réponses

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Il y a deux formes pour utiliser CASE.
    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CASE une_colonne
      WHEN une_valeur THEN un_resultat
      -- optionnellement
      WHEN une_autre_valeur THEN un_autre_resultat
      -- ...
       ELSE resultat_par_defaut
    END AS nom_colonne_resultat
    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CASE
      WHEN une_expression THEN un_resultat
      -- optionnellement
      WHEN une_autre expression THEN un_autre_resultat
      ELSE resultat par defaut
    END AS nom_colonne_resultat
    Exemples :
    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CASE Jour
      WHEN 'vendredi' THEN '16:30:00'
      ELSE '17:30:00'
    END AS Heure_fin_travail
    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CASE
      WHEN Sexe = 'F' AND sit_fam IN ('Mariée', 'Divorcée', 'Veuve') THEN 'Mme'
      WHEN Sexe = 'F' AND sit_fam IN ('Célibataire', 'Pacsée') THEN 'Mle'
      WHEN Sexe = 'H' THEN 'M.'
      ELSE ''
    END AS Civilite

  6. #6
    Candidat au Club
    Femme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Ça marche nickel avec CASE ! Merci beaucoup, depuis le temps que je cherche ça fait vraiment plaisir

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 29/09/2011, 16h08
  2. Faire un "group by" dans un dataset d'un report en MDX
    Par FracMaster dans le forum SSRS
    Réponses: 3
    Dernier message: 18/03/2011, 15h27
  3. Réponses: 1
    Dernier message: 09/09/2010, 10h37
  4. [c#][1.1][VS 2003] Faire un group By dans une datatable
    Par notalp dans le forum Accès aux données
    Réponses: 2
    Dernier message: 03/11/2006, 21h18
  5. Réponses: 5
    Dernier message: 08/03/2004, 10h28

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