Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/05/2011, 14h35   #1
Invité de passage
 
Femme
Développeur Web
Inscription : 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 : 1
Points : 1
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.
Syoleqa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 15h06   #2
Membre éprouvé
 
Avatar de Nheo_
 
Homme
Étudiant
Inscription : avril 2011
Messages : 317
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : avril 2011
Messages : 317
Points : 405
Points : 405
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 :
1
2
3
4
SELECT * FROM
(SELECT nom,langue FROM livres 
ORDER BY FIELD(nom, langue, "fr", "en", "it")) t 
GROUP BY t.nom
Nheo_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 16h05   #3
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
Si cette requête donne le résultat attendu, c'est un pur coup de chance...
En effet,
Code :
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 :
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
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 16h50   #4
Invité de passage
 
Femme
Développeur Web
Inscription : 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 : 1
Points : 1
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
Syoleqa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 17h09   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 000
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 000
Points : 18 265
Points : 18 265
Envoyer un message via MSN à CinePhil
Il y a deux formes pour utiliser CASE.
1)
Code :
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 :
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 :
1
2
3
4
CASE Jour
  WHEN 'vendredi' THEN '16:30:00'
  ELSE '17:30:00'
END AS Heure_fin_travail
2)
Code :
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
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/05/2011, 17h31   #6
Invité de passage
 
Femme
Développeur Web
Inscription : 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 : 1
Points : 1
Ça marche nickel avec CASE ! Merci beaucoup, depuis le temps que je cherche ça fait vraiment plaisir
Syoleqa est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h37.


 
 
 
 
Partenaires

Hébergement Web