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 :

SELECT DISTINCT et double tri


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Avatar de jak0
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    272
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 272
    Par défaut SELECT DISTINCT et double tri
    Bonjour à tous,

    Avant de commencer voici quelques précisions :
    - Version MySQL = MySQL 4.0.25
    - MLD :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Table lignes {
      id int(11), primary key
      numero int(10)
      heure int(11)
      etat int(2)
    }
    J'ai un petit problème sur une requête un peu compliqué. En fait, j'ai dans cette table une liste de numéro (qui peuvent apparaître plusieurs fois).
    J'aimerai lister ces numéro tout en les triant par etat. Le problème c'est que je ne veut afficher dans cette liste que les 30 premiers numéros par ordre d'état mais sans les faire apparaitre plusieurs fois. En cas d'existence d'un doublon, il faut que ça soit celui qui a l'heure la plus grande, mais que cela ne perturbe pas le nombre d'éléments.
    Je ne sais pas si j'ai été assez clair, alors voici une présentation plus "technique".

    - Listage des numéros (une seule fois) en triant par état avec une limite à 30 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT `numero` FROM `lignes` ORDER BY `etat` ASC, `numero` ASC LIMIT 30;
    Cette requête ne correspond pas tout à fait, parce qu'elle ne tient pas compte du champ de l'heure en cas d'existence de doublon pour un numero

    Alors j'ai pensé à une requête imbriqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT `numero` FROM `lignes` WHERE `id` = (SELECT `id` FROM `ligne` WHERE `numero` = ????? ORDER BY `heure` DESC LIMIT 1) ORDER BY `etat` ASC, `numero` ASC LIMIT 30;
    Cette requête a deux problèmes :
    - Je ne sais pas quoi mettre à la place de "?????"
    - Les requêtes imbriqués ne sont pas disponibles avec cette version de mysql

    Si quelqu'un pouvait m'aider à résoudre ce problème, ça serait vraiment cool.

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Comme ton MySQL ne supporte pas les sous-requêtes, ça ne va pas être possible, il aurait fallu faire un truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT T.numero
    FROM table T
    WHERE T.date = (
       SELECT MAX(T2.date)
       FROM Table T2
       WHERE T2.numero = T.numero
    )
    ORDER BY T.etat
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  3. #3
    Membre confirmé
    Avatar de jak0
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    272
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 272
    Par défaut
    Si c'est pas possible, c'est ma foi bien dommage, mais tu dis :
    WHERE T2.numero = T.numero
    En l'occurence, ce n'est pas deux tables différentes que je manipule mais une seule et meme table.

    FROM Table T2
    c'est pour faire un alias ????

    En fait, je viens de tester et apparement c'est oui. C'est déjà une bonne info

  4. #4
    Expert confirmé
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Par défaut
    Même si les données proviennent de la même table, elles ont deux origines différentes...
    le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE T2.numero = T.numero
    est justement là pour lier les deux requêtes... c'est ce qu'on appelle une sous-requête corrélée (dont le resultat dépend du resultat en cours [de la ligne en cours d'évaluation] dans la requête principale)

    en gros si tu veux, MySQL va parcourir toute ta table Table, et pour chaque ligne, il exécutera la seconde requête pour trouver la date max...

    si tu ne précise pas le numero qu'il faut tester, il va calculer la date max générale.
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag :resolu: (en bas)

  5. #5
    Membre confirmé
    Avatar de jak0
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    272
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 272
    Par défaut
    J'ai trouvé une solution, en trois étapes :

    1) Création d'une table "temporaire" et remplissage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE TABLE `table_temp` (`numero` INT(10) NOT NULL, `heure` INT(11), PRIMARY KEY (`numero`));
    INSERT INTO `table_temp` SELECT `numero`, MAX(`heure`) FROM `lignes` GROUP BY `numero`;
    2) Remplissage de la table puis récupération des données souhaitées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT `lignes`.`id`, `lignes`.`numero`, `lignes`.`heure`, `lignes`.`etat` FROM `table_temp` INNER JOIN `lignes` ON `table_temp`.`numero` = `lignes`.`numero` AND `table_temp`.`heure` = `lignes`.`heure` ORDER BY `lignes`.`etat`;
    3) Destruction de la table "temporaire" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DROP TABLE `table_temp`;
    Merci à tous et à la FAQ pour la piste donnée...

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

Discussions similaires

  1. SELECT Distinct avec tri par ordre d'apparition
    Par Nono23 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 17/07/2012, 15h16
  2. Question sur select distinct et le tri.
    Par assahdo dans le forum SQL
    Réponses: 6
    Dernier message: 25/06/2010, 09h55
  3. SELECT DISTINCT avec tri sur un autre champ que celui du distinct
    Par Stephane_br dans le forum Langage SQL
    Réponses: 5
    Dernier message: 09/11/2006, 11h37
  4. Select distinct et order by
    Par arsgunner dans le forum Langage SQL
    Réponses: 2
    Dernier message: 17/06/2004, 11h17
  5. equivalent SELECT DISTINCT pour MyBase?
    Par chrisou31 dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/03/2004, 19h33

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