Order by function

Résolu

Bonjour,

Soit une table SQL qui contient les colonnes X et Y.
Je peux les trier par X (croissant ou décroissant), Y ou les deux.

Est-il possible de trier sur base dune fonction de X et Y ?
par exemple Order by (X/Y)

Merci d'avance pour votre aide
Windows / Chrome 129.0.0.0

6 réponses

Résumé de la discussion

Le sujet porte sur le tri d'une table SQL selon une expression calculée à partir des colonnes X et Y, par exemple ORDER BY X/Y plutôt que X ou Y seules. Des réponses montrent que tout calcul peut être utilisé dans ORDER BY, par exemple SELECT X, Y FROM table ORDER BY X/Y, ou des variantes avec alias. En pratique, il est possible d'écrire des expressions plus avancées, par exemple X/(unix_timestamp()-Y), et de les trier directement sans étape intermédiaire en PHP. Une remarque utile est que l'ordre peut être influencé par la précision des valeurs et que l'utilisation d'alias dans ORDER BY simplifie l'écriture tout en conservant la lisibilité.

Bobot (l’IA à votre service)
  1. Dans phpMyAdmin ceci fonctionne

    SELECT X, Y FROM TesTable WHERE X <> 0
    ORDER BY X/(unix_timestamp()-Y) DESC

    Par contre en php

    $sql = 'SELECT X, Y FROM TesTable WHERE X <> 0
    ORDER BY X/(unix_timestamp()-Y) DESC';

    donne Parse error: syntax error, unexpected identifier "BY"

    0
    1. Contributeur

      On pase maintenant à la partie PHP.  Peut-être mieux de commencer un sujet dans le forum spécifique.

      Peux-tu partager un peu plus de code, et le texte complet du message d'erreur?

      0
    2. J'ai trouvé : il manque un espace devant ORDER.

      Problème entièrement résolu, encore merci à tous les intervenants.

      0
  2. Contributeur

    peut-être ainsi?

    SELECT `X`,`Y` FROM `TesTable` 
    ORDER BY (`X`/(unix_timestamp()/86400-`Y`)) DESC
    0
    1. Modérateur

      Le développement informatique est ponctué de tests, d'échecs puis réussite. Il faut regarder la doc et essayer différentes syntaxes quand il n'y a pas d'exemple qui corresponde directement à ce que l'on souhaite. En plus le select est sans risque, ce n'est pas une instruction destructrice comme insert ou delete pour lesquelles on sera plus précautionneux.

      "je parcours la table ... array", tu utilises un langage de programmation pour ton accès BDD ? comme Python, ou php ? dans ce cas, il faut utiliser à coté une fenêtre sql en mode ligne de commande pour tester les instructions. Le faire dans le programme est plus délicat, surtout quand la programmation des erreurs n'est pas impeccable, tu ne récupères alors pas le message d'erreur en retour d'une instruction qui échoue.


      1
      1. Modérateur

        Salut,

        le plus simple est d'ajouter une colonne où tu feras ton calcul et ensuite trier sur celle-ci.

        select a,b,(x/y) as "new" from table1 order by 3 asc

        <edit> doublon avec la réponse de jee pee...

        0
        1. Modérateur

          Bonjour,

          Est-ce que select X, Y from table order by X/Y marche ? je ne sais pas, mais avant de poser la question tu as testé ? et quelle est la réponse ?

          Moi si je teste et que cela ne fonctionne pas j'essaie select X, Y, X/Y as QUOT from table order by QUOT


          0
          1. Je viens d'essayer select X/Y as QUOT : ça fonctionne.

            Je vais voir comment je peux modifier mon query pour y inclure le tri.

            0
          2. Contributeur
            @Herve_be

            Il n'est pas nécessaire d'ajouter la division dans le SELECT, tu peux trier ainsi:

            SELECT x, y
            FROM xy
            order by x/y
            0
          3. @yg_be

            ORDER BY X/Y ne fonctionne pas comme souhaité

            il fait le tri sur X puis sur Y, pas sur X/Y

            0
          4. Contributeur
            @Herve_be

            Tu utilises vraiment le logiciel mysql?

            Peux-tu partager la source SQL de ta requête?

            0
          5. @yg_be

            J'utilise phpMyAdmin de mon serveur One.com

            Y est un timestamp Unix

            Voici un résultat : il trie sur X et non sur X/(Time-Y)

            SELECT `X`,`Y` FROM `TesTable` WHERE ORDER BY (`X`/(".Time()."-`Y`)) DESC 
            0
        2. Contributeur

          bonjour,

          c'est quoi cette fonction de X et Y?

          qu'as-tu essayé?

          quel résultat as-tu obtenu?

          0
          1. La fonction peut être n'importe quelle opération entre les colonnes X et Y, par exemple f=X/Y, f=X+Y, F=X*Y, ...

            Je n'ai rien essayé parce que je ne sais pas comment l'exprimer dans un Select ni même si c'est possible.

            Ce que je fais actuellement :
            je parcours la table, pour chaque row je calcule la fonction et je met la valeur dans un array
            je trie l'array
            je me demandais si on ne peut pas obtenir le même résultat directement à partir du Select.

            0