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 :

Tri sur l'ensemble d'une table sauf premier enregistrement


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    261
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 261
    Points : 125
    Points
    125
    Par défaut Tri sur l'ensemble d'une table sauf premier enregistrement
    Soit les enregistrements

    1 Paul
    2 Max
    3 Carla
    4 Leo


    Je voudrais obtenir le premier suivi d'un classement par ordre alpha du reste de la liste

    ce qui donnerait

    1 Paul
    3 Carla
    4 Leo
    2 Max


    Le code ci-dessous ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *FROM `table`LIMIT 1
    UNION 
    SELECT *FROM `table`ORDER BY groupe ASC
    car il applique le tri sur l'ensemble du résultat et pas uniquement sur le second SELECT

    Comment faire ?
    Merci à tous

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 249
    Points : 1 745
    Points
    1 745
    Par défaut
    Normalement, vous ne devriez pas imposer un tel traitement à votre sgbd.
    Faites 2 requêtes.
    remplissez un tableau à l'aide de la première requête puis la seconde.
    vous programmez en php ?

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Salut,
    Essaie comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM `table`
    ORDER BY case when groupe='Paul' then 'A' else groupe end
    Remarque : Il est préférable d'utiliser un ORDER BY avec un LIMIT pour garantir l' ordre de restitution avant de limiter l'affichage.
    Mais dans ton cas un WHERE semblait préférable.

    [EDIT]Mais je suis d'accord avec ylarvor,en fonction de la volumétrie et surtout si groupe est indexer il peut être préférable de faire 2 requêtes.

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Quitte à me faire tabasser par tout le monde, je tenterais bien un truc du genre :

    1) tu gardes ton deuxième morceau de requête, mais tu rajoutes nom une deuxième fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT id, nom, nom as fictif
    FROM TaTable
    Order by nom
    2) tu prends ta première partie, et tu bricoles encore un peu plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT id, nom, '' as fictif
    FROM TaTable
    Order by id
    Limit 1
    3) Tu colles tes morceaux ensemble, et tu tries par fictif !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT id, nom FROM (
    SELECT id, nom, fictif FROM (
    SELECT id, nom, '' as fictif
    FROM TaTable
    Order by id) u
    UNION ALL
    SELECT id, nom, fictif FROM (
    SELECT id, nom, nom as fictif
    FROM TaTable
    Order by nom) t
    ) w
    order by fictif
    Alors, par rapport à Skuatamad :
    - j'ai du fumer un truc pas net, ou c'est juste la fatigue
    - Sur ton gros tri, si ta colonne nom est indexée, tu ne casses pas l'index avec un case dans le ORDER BY
    - certes il reste un tri supplémentaire dans la surrequête finale, mais vu que c'est déjà trié, ça va très vite...

    (j'ai tenté sous l'SQL Server que j'ai sous la main en utilisant de TOP, je ne sais pas si ça marche exactement de la même manière sous MySQL)

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    j'ai du fumer un truc pas net, ou c'est juste la fatigue
    Alors faut que je t'avoue que j'ai un peu modifier la requête au fil du temps (et dans un premier temps parce que ça collait pas du tout) , ceci dit je suis pas sûr que 'A' soit le tout premier caractère, une petite précision m'intéresse.
    Sinon évidemment un tri sur une colonne fictive, c'est nickel mais je voulais tenté une feinte, j'ai eu tord?
    Par contre, je ne sais pas si le 1er voulais dire le plus petit id ou paul, et dans le cas de l'id la feinte ne marche plus.
    Sur ton gros tri, si ta colonne nom est indexée, tu ne casses pas l'index avec un case dans le ORDER BY
    - certes il reste un tri supplémentaire dans la surrequête finale, mais vu que c'est déjà trié, ça va très vite...
    Merci, pour la précision.

  6. #6
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    A vrai dire, je sais pas si le SGBD peut détecter le fait que tu aies déjà fait quasiment tout le boulot.

    Par contre, ce qui est sûr, c'est que même l'algorithme de tri le plus mauvais de l'univers va plutôt vite quand il n'y a rien à faire...

    (imagine toi une bonne bouse itérative pour faire ton tri, et regarde ce que ça donne )

Discussions similaires

  1. [MySQL-4.0] ALTER ORDER fonctionne pas sur une table, sauf renommée
    Par hobby dans le forum Requêtes
    Réponses: 1
    Dernier message: 05/01/2014, 08h44
  2. Réponses: 5
    Dernier message: 14/05/2013, 15h13
  3. [WD15] Tri sur liste combo intégré à une rubrique table mémoire
    Par GCASPIC10 dans le forum WinDev
    Réponses: 6
    Dernier message: 03/02/2011, 12h04
  4. [AC-2007] tri sur un champ dans une table Access
    Par hutchy33 dans le forum VBA Access
    Réponses: 1
    Dernier message: 29/08/2009, 10h48
  5. contrainte sur deux champs d'une table
    Par bdkiller dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 17/09/2004, 18h26

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