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 DESC avec les veleurs NULL


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Points : 5
    Points
    5
    Par défaut ORDER BY DESC avec les veleurs NULL
    Bonjour,

    Par défaut dans MySQL les valeurs NULL, sur des requêtes ayant un ORDER BY colonne DESC se place à la fin du résultat.

    Comme indiqué dans la doc :
    Lors de l’utilisation de ORDER BY, les valeurs NULL sont presentees en premier. Si vous triez dans l’ordre decroissant en utilisant DESC, les valeurs NULL sont presentees en dernier.
    J'aimerais placer les résultats NULL entête du résultat avec une requête ayant ORDER BY colonne_n DESC, colonne_m DESC

    J'ai cherché à mettre au point une solution mais sans succès, puis j'ai cherché sur le web mais j'ai eu le même résultat.

    D'avance un grand merci pour votre aide,

    Vertical

  2. #2
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    A partir de MySQL 4.0, tu peux utiliser une UNION :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT * FROM latable 
    WHERE colonne_n IS NULL OR colonne_m IS NULL
    ORDER BY colonne_m DESC
    UNION
    SELECT * FROM latable 
    WHERE colonne_n IS NOT NULL AND colonne_m IS NOT NULL
    ORDER BY colonne_n DESC, colonne_m DESC

  3. #3
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Très bonne idée Maximilian ! Sinon, je pensais à une méthode en utilisant des CASE ... WHEN. Mais la méthode de Maximilian est beaucoup plus simple et beaucoup plus efficace.

  4. #4
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    "Malheureusement" j'ai une v. 3.23 , j'hésite encore à upgrader.

    Pourtant l'idée de Maximilian me plaisait bien !

    Par contre avec des CASE WHEN je ne vois pas comment faire à part en remplaçant par des valeurs bidon du genre 9999 si la valeur est NULL, mais cette solution n'est pas propre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CASE WHEN colonne_n =  NULL THEN 9999 ELSE colonne_n END
    D'avance merci

    Séb

  5. #5
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Non en fait je voyais cela ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT mon_champ, CASE WHEN colonne_n =  NULL THEN 1 ELSE 0  END as tri, colonne _n
    FROM ma_taable
    ORDER BY tri DESC, colonne_n DESC
    Cela permet de conserver la valeur de la colonne_n et de ne pas risquer un malencontreux conflit si colonne_n valait 99999

  6. #6
    Futur Membre du Club
    Inscrit en
    Mai 2004
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Mai 2004
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Super ! Merci beaucoup :-) T'as solution me conviens très bien.

    Encore merci ,

    Séb

  7. #7
    Membre régulier
    Inscrit en
    Avril 2006
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 110
    Points : 76
    Points
    76
    Par défaut
    Citation Envoyé par Maximilian
    A partir de MySQL 4.0, tu peux utiliser une UNION :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT * FROM latable 
    WHERE colonne_n IS NULL OR colonne_m IS NULL
    ORDER BY colonne_m DESC
    UNION
    SELECT * FROM latable 
    WHERE colonne_n IS NOT NULL AND colonne_m IS NOT NULL
    ORDER BY colonne_n DESC, colonne_m DESC
    Après avoir utilisé cette solution et obtenu une erreur je me permets de préciser qu'il vous faudra peut-être utiliser des parenthèses pour que ça fonctionne :
    (select...) union (select...)

    http://dev.mysql.com/doc/refman/5.0/fr/union.html

  8. #8
    Membre expérimenté
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Points : 1 351
    Points
    1 351
    Par défaut
    Puisque nous sommes parti dans les commentaires, j'ajouterai que je suis un peu gêné par la comparaison qui est faite ici. Utilisé l'opérateur '=' avec NULL, c'est pas très beau et peut être source de confusion : http://dev.mysql.com/doc/refman/5.0/...operators.html

    Et pour ce qui est des version récente, on peu imaginer une solution passant par la fonction IFNULL. Pour les version antérieure à 4.0.6, la fonction IF serait peut-être une solution plus légère : http://dev.mysql.com/doc/refman/5.0/...functions.html

  9. #9
    Membre expert
    Avatar de Alexandre T
    Homme Profil pro
    Chef de projets AMO
    Inscrit en
    Mai 2002
    Messages
    1 213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets AMO
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 213
    Points : 3 001
    Points
    3 001
    Par défaut
    Citation Envoyé par Adjanakis
    Utilisé l'opérateur '=' avec NULL, c'est pas très beau et peut être source de confusion : http://dev.mysql.com/doc/refman/5.0/...operators.html
    Tout à fait et autant pour moi !

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 14/01/2009, 16h01
  2. Pb avec les Dates NULL
    Par solitude dans le forum C#
    Réponses: 2
    Dernier message: 08/03/2008, 13h04
  3. J’ai un souci avec les valeurs null sous sql server.
    Par zoltix dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/06/2006, 10h27
  4. problème avec les dates nulles
    Par shingo dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 30/09/2005, 12h32
  5. PROBLEME AVEC LES REQUETES IS NULL / NOT EXISTS
    Par sylvaine dans le forum Langage SQL
    Réponses: 5
    Dernier message: 04/06/2004, 13h26

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