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 10/02/2012, 11h26   #1
Invité de passage
 
Inscription : février 2007
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 3
Points : 0
Points : 0
Par défaut Tri et sous tri sur un seul champs

Bonjour,

Mon problème est le suivant:
Un champs "note" contient des valeurs entières comprises entre 0 et 99.

Je souhaite afficher les résultats de la manière suivante:
Les notes comprisent entre 0 et 9 doivent être affichées en premier et par ordre décroissant. A la suite desquelles je souhaite afficher les autres notes (donc de 10 à 99) elle aussi par ordre décroissant.

Exemple du classement voulu par valeur de note:
9, 8, 7, ..., 1, 0, 99, 89, 88, ..., 11, 10

Voici les deux requêtes que j'ai essayé pour l'instant, sans succès:
1ere requête
Code :
1
2
3
4
5
6
7
8
 
SELECT main.* 
FROM main
ORDER BY
CASE
    WHEN main.note LIKE '_' THEN 1
    WHEN main.note LIKE '__' THEN 2
END DESC
Ici, j'ai bien le groupe de 0 à 9 qui s'affiche en premier, mais non classé. Le second groupe (99 à 10) vient bien après, mais non classé également.

2nd requête
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
(SELECT main.*, 1 OrderNum 
 FROM main 
 WHERE (main.note LIKE '_')
 ORDER BY main.note DESC)
 
UNION
 
(SELECT main.*, 2 OrderNum
 FROM main 
 WHERE (main.note NOT LIKE '_')
 ORDER BY main.note DESC)
 
ORDER BY OrderNum
Ce qui me donne le même résultat qu'à la première requête...

Merci de votre aide.
Tich' est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 11h30   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 659
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 659
Points : 2 662
Points : 2 662
bonjour,


vous n'êtes pas loin de la solution :
Code :
1
2
3
4
5
6
 
SELECT main.* 
FROM main
ORDER BY
CASE
    WHEN main.note LIKE '_' THEN 1 else 2 END DESC, main.note
punkoff est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2012, 11h48   #3
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 928
Points : 1 928
Bizard ce LIKE...

Pour la seconde requête, le UNION (qui fait un DISTINCT) flingue les tris des sous-requêtes.
Lorsqu'on fait une union de 2 requêtes avec des colonnes créées dans la requête (OrderNum dans ton exemple) il faut utiliser UNION ALL qui ne fait pas de DISTINCT (opération lourde qu'on ne souhaite pas faire quand elle est inutile).
Deuxièmement on ne tri pas dans une sous requête c'est inutile sauf quand on utilise LIMIT (là c'est obligatoire)

Punkoff le tri voulu est dans l'autre sens si je ne m'abuse, j'aurais fait :
Code :
ORDER BY length(note), note DESC
plus court à écrire sinon :
Code :
ORDER BY case when note BETWEEN 0 AND 9 then 1 else 2 end, note DESC
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/02/2012, 11h49   #4
Invité de passage
 
Inscription : février 2007
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 3
Points : 0
Points : 0
Citation:
Envoyé par punkoff Voir le message
bonjour,


vous n'êtes pas loin de la solution :
Code :
1
2
3
4
5
6
 
SELECT main.* 
FROM main
ORDER BY
CASE
    WHEN main.note LIKE '_' THEN 1 else 2 END DESC, main.note
Merci de votre réponse.
J'obtiens ce classement:
10, 11, ..., 98, 99, 0, 1, ..., 8, 9

C'est mieux car les deux sous groupes sont classés, mais la disposition globale n'est pas la bonne.

Pour info, avec "ASC" j'obtiens:
0, 1, ..., 9, 10, ..., 99

Une autre idée ?
Tich' est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 10/02/2012, 11h52   #5
Invité de passage
 
Inscription : février 2007
Messages : 3
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 3
Points : 0
Points : 0
Citation:
Envoyé par skuatamad Voir le message
Bizarre ce LIKE...

Pour la seconde requête, le UNION (qui fait un DISTINCT) flingue les tris des sous-requêtes.
Lorsqu'on fait une union de 2 requêtes avec des colonnes créées dans la requête (OrderNum dans ton exemple) il faut utiliser UNION ALL qui ne fait pas de DISTINCT (opération lourde qu'on ne souhaite pas faire quand elle est inutile).
Deuxièmement on ne tri pas dans une sous requête c'est inutile sauf quand on utilise LIMIT (là c'est obligatoire)

Punkoff le tri voulu est dans l'autre sens si je ne m'abuse, j'aurais fait :
Code :
ORDER BY length(note), note DESC
plus court à écrire sinon :
Code :
ORDER BY case when note BETWEEN 0 AND 9 then 1 else 2 end, note DESC
C'est parfait ! Merci.
Tich' 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 09h52.


 
 
 
 
Partenaires

Hébergement Web