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 :

Comment mettre les entrée sans donnée à la fin avec ORDER BY ?


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 284
    Points : 149
    Points
    149
    Par défaut Comment mettre les entrée sans donnée à la fin avec ORDER BY ?
    Bonjour,

    Je cherche à afficher les entrées d'une table par ordre croissant d'un champ "date", jusque là tout va bien, le problème c'est que certains champs n'ont pas de date, et la base de donnée affecte par défaut 0000-00-00 et me les mets donc au début, hors le but de mon listing est d'effectuer un ordre de priorité (plus la date est proche plus l'entrée doit apparaître en tête de liste, et les entrées sans date n'ayant aucune priorité, je veux les faire apparaître en fin de liste.

    Je pourrais leur attribuer une date bidon (8000-10-08) pour être sûr que mon script soit fonctionnel pour les 6000 prochaines années mais je ne veux pas faire apparaître une fausse date, j'aimerais aussi éviter de créer un champ booléen juste pour gérer l'affichage ou le non affichage de la date (dans la mesure du possible ).

    Donc si il existe une petite astuce merci de m'éclairer !

  2. #2
    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 : 60
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Essaie ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ORDER BY 
      CASE 
        WHEN la_date <> '0000-00-00' THEN la_date 
      END, 
      la_date
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 284
    Points : 149
    Points
    149
    Par défaut
    L'affichage est identique (les entrées 0000-00-00 en tête de liste), voici la requête exacte (en ayant remplacé le champ "la_date" évidemment ):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $reponse = $bdd->query("SELECT * FROM courrier WHERE traite=0 ORDER BY 
    							CASE 
    							WHEN la_date <> '0000-00-00' THEN la_date 
    							END, 
    							la_date");

  4. #4
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Peut-être que les lignes dont la colonne n'est pas datée contiennent en fait NULL et non '0000-00-00'
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 13
    Points : 22
    Points
    22
    Par défaut
    Si les dates sont nulles, il faudra :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM courrier WHERE traite=0 ORDER BY NVL(la_date,sysdate + 10000)

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 284
    Points : 149
    Points
    149
    Par défaut
    Bonjour et merci pour vos réponses,

    quand je fais "afficher" sur ma table "courrier" dans phpMyAdmin, pour le champ la_date (que j'appelle en fait sortie_max) il y a soit des dates que l'utilisateur à entré auparavant, soit "0000-00-00".

    Dans le doute où ce ne serait qu'un affichage bidon et que MySQL considérerait NULL, j'ai testé la méthode proposé par mmazerolle et voilà ce que j'obtiens avec un or die(print_r($bdd->errorInfo())).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Array ( [0] => 42000 [1] => 1305 [2] => FUNCTION base_de_donnee.NVL does not exist ) 1
    Si il n'y a vraiment pas de solution je ferai 2 tables distinctes mais ce serait dommage !

  7. #7
    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 : 60
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    NVL est, je crois, une fonction Oracle. La réponse de mmazerolle ne pouvait pas convenir.

    Essaie cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT * 
    FROM courrier WHERE traite=0 
    ORDER BY 
        CASE 
            WHEN la_date IS NOT NULL THEN la_date 
        END, 
        la_date
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    284
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 284
    Points : 149
    Points
    149
    Par défaut
    Je viens d'essayer et les entrées sans date sont toujours en tête de liste avec ce script, la valeur n'est pas NULL mais bien 0000-00-00.

  9. #9
    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 : 60
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Voilà une astuce qui fonctionne chez moi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT id, objet, 
    CASE
      WHEN date_reception IS NULL OR date_reception = '0000-00-00' THEN 'date inconnue'
      ELSE date_reception
    END AS date_de_reception
    FROM `courrier` 
    ORDER BY date_de_reception
    Les caractères étant classés après les chiffres, il suffit de transformer la date '0000-00-00' en un texte commençant par une lettre.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  10. #10
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Points : 22
    Points
    22
    Par défaut
    Salut tu as essayé ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM courrier ORDER BY ISNULL(dayofyear(`la_date`)), `la_date` ASC
    dayofyear renvoie null si le jour de l'année est 0.

Discussions similaires

  1. Réponses: 4
    Dernier message: 27/03/2007, 09h49
  2. Comment mettre les relations entre mes requêtes?
    Par cheickssy dans le forum Access
    Réponses: 2
    Dernier message: 22/03/2006, 17h42
  3. Réponses: 2
    Dernier message: 18/10/2005, 10h54
  4. comment lister les sources de données utilisateur
    Par lassad dans le forum Bases de données
    Réponses: 1
    Dernier message: 12/10/2005, 13h56

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