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

Langage SQL Discussion :

Problème avec : "ORDER BY (x-y) DESC"


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Points : 23
    Points
    23
    Par défaut Problème avec : "ORDER BY (x-y) DESC"
    Bonjour,

    voici la requete qui me pose probleme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM ma_table ORDER BY (x-y) DESC LIMIT 0,20

    Il n'y a pas de probleme lorsque x>=y : les 20 premiers enregistrements sont biens affichés du plus grand au plus petit.


    Par contre, s'il un enregistrement où x<y, il y a un probleme... Celui-ci s'affiche avant les enregistrments où x>y


    Voici un exemple illustré au cas où mon explication n'est pas assez claire:




    Merci d'avance pour votre aide. Je ne vois vraiment pas où j'aurais pu faire une erreur...

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    x et y sont bien de type numériques ?

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par Waldar Voir le message
    x et y sont bien de type numériques ?
    Pour x et y :
    type : smallint(5)
    Attributs : UNSIGNED
    Null : Non
    Défaut : 0


    j'avais vérifié avant de poser la question mais merci pour ton aide

  4. #4
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    x smallint(5) UNSIGNED
    Le résultat de X-Y doit être casté par défaut dans le type de X. Donc tu perds le signe.
    Fais un essai avec ORDER BY CAST (X-Y AS SIGNED) pour voir ?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par TheLeadingEdge Voir le message
    Le résultat de X-Y doit être casté par défaut dans le type de X. Donc tu perds le signe.
    Fais un essai avec ORDER BY CAST (X-Y AS SIGNED) pour voir ?
    Merci TheLeadingEdge mais ton code ne fonctionne pas. Bien joué tout de même parce que tu as bien identifié le problème : en modifiant les paramètres de X et Y (en supprimant la propriété unsigned), le problème a disparu.


    Si quelqu'un pourrait me donner la formule magique à insérer dans la requête, je suis preneur... merci

  6. #6
    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
    Citation Envoyé par tomazawak Voir le message
    le problème a disparu.


    Si quelqu'un pourrait me donner la formule magique à insérer dans la requête, je suis preneur... merci
    Si le problème a disparu, quel autre résultat attends-tu ?
    Tu veux dire que tu veux garder UNSIGNED pour la propriété des colonnes x et y ?

    En quoi le code de TheLeadingEdge ne fonctionne pas ?
    Quel message d'erreur ?

    Quel SGBD au fait ? MySQL ?
    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 !

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Si quelqu'un pourrait me donner la formule magique à insérer dans la requête, je suis preneur... merci
    Il suffit de faire un CAST, cela fait partie de la norme SQL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...ORDER BY (x-CAST(y AS INTEGER))
    Il est d'ailleurs stupéfiant de voir que MySQL encore une fois ne respecte pas la norme puisque dans le résultat d'une expression mêlant différents types, le résultat doit être dans le type "le plus large" !
    Sachez que le type UNSIGNED n'existe pas en SQL....
    Le bon conseil c'est de respecter la norme SQL et ainsi éviter les bêtises spécifique de MySQL !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    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
    Citation Envoyé par SQLpro Voir le message
    Il est d'ailleurs stupéfiant de voir que MySQL encore une fois ne respecte pas la norme puisque dans le résultat d'une expression mêlant différents types, le résultat doit être dans le type "le plus large" !
    Sachez que le type UNSIGNED n'existe pas en SQL....
    Le bon conseil c'est de respecter la norme SQL et ainsi éviter les bêtises spécifique de MySQL !
    Et je crois que, malheureusement, CAST(colonne AS INTEGER) ne fonctionne pas en MySQL. Il faut lui préciser SIGNED ou UNSIGNED !
    Citation Envoyé par Documentation MySQL
    MySQL supporte l'arithmétique avec les valeurs 64 bits signées et non signées. Si vous utilisez une opération numérique (comme le signe +) et qu'un des opérandes est de type unsigned integer, alors, le résultat sera une valeur non signé. Vous pouvez corriger cela en utilisant les opérateurs de transtypages SIGNED et UNSIGNED, qui transformeront l'opération respectivement en un entier signé sur 64 bits et un entier non signé sur 64 bits.
    mysql> SELECT CAST(1-2 AS UNSIGNED)
    -> 18446744073709551615
    mysql> SELECT CAST(CAST(1-2 AS UNSIGNED) AS SIGNED);
    -> -1
    Le résultat de la première opération ci-dessus est un sacré piège !
    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 !

  9. #9
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    C'est surtout stupéfiant de bêtise !!!! Et montre que ne pas respecter la norme SQL et implémenter des UNSIGNED conduit à ce genre d'horreur... Alors que pour un tel type il suffit d'implémenter un domaine SQL comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE DOMAIN INT_POSITIF
    AS INT
    CHECK VALUE > 0
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Si le problème a disparu, quel autre résultat attends-tu ?
    Tu veux dire que tu veux garder UNSIGNED pour la propriété des colonnes x et y ?
    En effet, le problème disparait si j'enlève la propriété UNSIGNED sur x et y.
    Mais j'ai besoin de conserver cette propriété.


    En quoi le code de TheLeadingEdge ne fonctionne pas ?
    Quel message d'erreur ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SIGNED) DESC, x DESC LIMIT 0,10' at line 1
    Quel SGBD au fait ? MySQL ?
    oui

  11. #11
    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
    On peut avoir le texte exact de la requête soumise à MySQL ?

    Le message d'erreur signifie qu'il y a une erreur de syntaxe juste avant le mot SIGNED.
    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 !

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...ORDER BY (x-CAST(y AS INTEGER))
    cela renvoit l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INTEGER)) DESC, x DESC LIMIT 0,10' at line 1

  13. #13
    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
    Comme je l'ai dit plus haut, CAST(expression AS INTEGER) est refusé par MySQL qui n'accepte que les SIGNED et UNSIGNED dans cette fonction pour convertir en entier.
    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 !

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CAST(CAST(1-2 AS UNSIGNED) AS SIGNED)

    ce code fonctionne! merci beaucoup!

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Points : 23
    Points
    23
    Par défaut
    Vous assurez sur ce forum! J'ai posé 2 questions ici et à chaque fois, vous m'avez vraiment aidé.

    MERCI !

  16. #16
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    re,

    CAST (X-Y AS ''type'') j'étais sur de moi, c'est le LIMIT dans ta requête qui m'a poussé à suggérer le SIGNED. Mais ça c'était de l'interprétation de ma part.

    Plus classiquement :
    fais un essai avec ORDER BY (X-Y)*(X-Y)

  17. #17
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par TheLeadingEdge Voir le message
    (X-Y)*(X-Y)
    soit x1 = 5 et y1 =2
    soit x2 = 10 et y2 = 20


    (X1-Y1)*(X1-Y1) = 9
    (X2-Y2)*(X2-Y2) = 100


    "2" reste quand meme en premiere position...

  18. #18
    Membre expert
    Avatar de TheLeadingEdge
    Inscrit en
    Mai 2005
    Messages
    1 199
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 1 199
    Points : 3 103
    Points
    3 103
    Par défaut
    omme tu as déjà une solution c'est juste par archarnement
    ORDER BY SQRT((X-Y)*(X-Y))

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 52
    Points : 23
    Points
    23
    Par défaut
    Citation Envoyé par TheLeadingEdge Voir le message
    omme tu as déjà une solution c'est juste par archarnement

    SQRT ça correspond à quoi? racine carré?

  20. #20
    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
    SQRT = SQuare RooT je crois. Racine carrée in French.
    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 !

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/07/2009, 14h46
  2. Problème avec ORDER BY DESC
    Par BraDim dans le forum Bases de données
    Réponses: 7
    Dernier message: 25/01/2008, 09h37
  3. [MySQL] problème avec ORDER BY _ DESC avec des flottants
    Par Hayabusa dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 25/08/2006, 00h00
  4. [SQL]Problème avec ADO - Order by
    Par Dnx dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 03/11/2005, 10h55
  5. Formulaires : problème avec les slashes et les quotes
    Par GarGamel55 dans le forum Langage
    Réponses: 1
    Dernier message: 12/10/2005, 15h59

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