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

PHP & Base de données Discussion :

requete sql étonnante [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut requete sql étonnante
    bonjour,

    j'ai une requete de type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $sql5= "select numemission from m ORDER BY numemission DESC LIMIT 0,1";//ou bien ORDER BY numemission DESC LIMIT 0,1
    $result5 = mysql_query($sql5) or die("Requete pas comprise");
    $row5=mysql_fetch_array($result5);
    $numemiss=$row5[0];
    echo $numemiss;
    le numemission de type 1/2010
    2/1010...
    10/2010
    ...

    cette requete me renvoi toujours 9/2010
    et non pas les insertions après le 9/2010
    j'ai essayé aussi select max(numemission)....
    la meme chose
    pourriez vous m'aidez

  2. #2
    Membre éprouvé
    Inscrit en
    Décembre 2009
    Messages
    80
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 80
    Par défaut
    Si par exemple tes entrées sont :
    1/2010
    2/2010
    9/2010
    10/2010
    11/2010
    1/2011

    En fait l'ordre demandé sera un ordre alpha-numérique, or 9 est plus grand que 1 donc 9/2010 est plus "grand" que 12/2010 ou encore 1/2011

    En conclusion pour avoir l'ordre que tu attends, il faudrait que tes numemission soient du genre :
    2010/01
    2010/02
    2010/09
    2010/10
    2010/11
    2011/01

  3. #3
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut
    non je peux pas mettre l'année avant
    il faut qu'il soit numero/année

    1/2010
    ...
    10/2010
    11/2010


    j'ai essayé ça aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $sql5= 'select * from m where numemission='.mysql_insert_id() ;
    $result5 = mysql_query($sql5) or die("Requete pas comprise");
    $row5=mysql_fetch_array($result5);
    $numemiss=$row5[0];
    echo $numemiss;
    il m'envoi rien
    et si je met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $sql5= 'select LAST_INSERT_ID() from m' ;
    $result5 = mysql_query($sql5) or die("Requete pas comprise");
    $row5=mysql_fetch_array($result5);
    $numemiss=$row5[0];
    echo $numemiss;
    il m'envoi 0 pourtant j'ai des enregistrements

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    LAST_INSERT_ID ou mysql_insert_id (qui sont équivalents) ne fonctionneront pas puisqu'ils renvoient le dernier id généré (champ auto-incrémenté) lors d'une insertion sur la même "connexion". Or, ici, il n'y a aucune insertion.

    +1 pour OlgarK : en l'état, si vous voulez vraiment effectuer ce tri lors de vos requêtes il vous faudra utiliser les fonctions du SGBD. Par exemple (en ASC) :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    ... ORDER BY CAST(SUBSTRING_INDEX(`champ`, '/', -1) AS SIGNED), CAST(SUBSTRING_INDEX(`champ`, '/', 1) AS SIGNED)
    Ou encore :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    ... ORDER BY YEAR(STR_TO_DATE(`champ`, '%c/%Y')), MONTH(STR_TO_DATE(`champ`, '%c/%Y'))
    (non testé)

  5. #5
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut
    merci pour la réponse,
    mais j'ai pas bien compris le tri

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... ORDER BY CAST(SUBSTRING_INDEX(`champ`, '/', -1) AS SIGNED), CAST(SUBSTRING_INDEX(`champ`, '/', 1) AS SIGNED)
    j'ai écris:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql5= "select numemission from m  ORDER BY CAST(SUBSTRING_INDEX(`numemission`, '/', -1) AS SIGNED), CAST(SUBSTRING_INDEX(`numemission`, '/', 1) AS SIGNED) ";
    il me renvoi 4/2010
    alors que il faut qu'il me renvoi 10/2010

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Il faut remettre DESC au niveau des ORDER, je suppose, c'est en ASC là, comme je l'ai précisé plus haut.

  7. #7
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut
    bon j'ai fait cette requete:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql5= "select numemission from mandats  ORDER BY CAST(SUBSTRING_INDEX(`numemission`, '/', -1) AS SIGNED), CAST(SUBSTRING_INDEX(`numemission`, '/', 1) AS SIGNED) DESC";
    ça marche nickel sauf que elle m'affiche selon l'ordre de la partie gauche
    c'est à dire si j'ai 1/2010 et 2/2010
    il m'affiche 2/2010 c'est bon
    mais

    il reste maintenant vérifier la partie droite
    c'est à dire
    si j'ai 322/2010
    et 44/2011
    il m'affiche 322/2010

    alors que il faut afficher 44/2011
    il faut faire quoi?
    avez vous une idée?
    meme sur 2 requetes c'est pas grave

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Il faut mettre deux fois DESC : aux deux critères du ORDER. Seul le dernier est ordonné en décroissant (partie après le /), le premier (partie avant le /) reste, dans votre requête, croissant.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT `numemission` FROM `mandats` ORDER BY CAST(SUBSTRING_INDEX(`numemission`, '/', -1) AS SIGNED) DESC, CAST(SUBSTRING_INDEX(`numemission`, '/', 1) AS SIGNED) DESC -- LIMIT 1 ?


    (enfin tout dépend ce qu'on veut)

    C'est lourd pour pas grand chose ...

  9. #9
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut
    merciiiiiiiii beacoup
    vraiment un grand merci à vous
    une remarque
    j'ai mis ASC au lieu de DESC dans la deuxième
    et ça ma donnée le meme resultat

  10. #10
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Pas assez de données pour constater un résultat différent ? Car ce n'est pas la même chose.

  11. #11
    Inactif
    Inscrit en
    Novembre 2007
    Messages
    369
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 369
    Par défaut
    donc il faut mettre les deux sur DESC

  12. #12
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Il suffit de tester. Il y a 4 combinaisons possibles avec ces ORDER :

    Prenons ces données :
    • 2/2010
    • 4/2010
    • 1/2011
    • 3/2011


    Ces ordonnancements (pour votre requête) :
    • ASC, ASC : partie droite de la plus basse à la plus haute (numériquement toujours) puis partie gauche de la plus basse à la plus haute :
      • 2/2010
      • 4/2010
      • 1/2011
      • 3/2011
    • ASC, DESC : partie droite de la plus basse à la plus haute puis partie gauche de la plus haute à la plus basse :
      • 4/2010
      • 2/2010
      • 3/2011
      • 1/2011
    • DESC, ASC : partie droite de la plus haute à la plus basse puis partie gauche de la plus basse à la plus haute :
      • 1/2011
      • 3/2011
      • 2/2010
      • 4/2010
    • DESC, DESC : partie droite de la plus haute à la plus basse puis partie gauche de la plus haute à la plus basse :
      • 3/2011
      • 1/2011
      • 4/2010
      • 2/2010


    Donc ça dépend ce que vous voulez puisque le résultat n'est pas le même. Mais du peu que vous avez laissé entendre, ce serait bien DESC, DESC que vous cherchez.

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

Discussions similaires

  1. Problème Requete SQL et QuickReport
    Par arnaud_verlaine dans le forum C++Builder
    Réponses: 7
    Dernier message: 07/01/2004, 09h31
  2. Prob de requete sql et variable
    Par agent-zaizai dans le forum ASP
    Réponses: 11
    Dernier message: 21/10/2003, 16h54
  3. requete sql
    Par autumn319 dans le forum ASP
    Réponses: 22
    Dernier message: 10/09/2003, 16h46
  4. Paramètre requete SQL (ADOQuery)
    Par GaL dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/07/2002, 11h24
  5. Resultat requete SQL
    Par PierDIDI dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/07/2002, 13h43

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