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 :

DOUBLE TRI PAR DATE


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 266
    Par défaut DOUBLE TRI PAR DATE
    Bonjour,

    Voilà mon problème...
    J'ai une table 'test' comprenant les champs id,event,start,end.
    J'ai simplifié le tout.
    Chaque évènement a un statut qui n'est pas en base selon les start et end date:

    id  |	 event       |	start 		|	end            
    1   |	 event01   |   2017-01-01     |   2017-01-10 =>  Terminé
    2   |   event02   |   2017-01-02	|   2017-01-25 =>  En cours
    3   |   event03   |   2017-01-26	|   2017-01-30 =>  A venir
    4   |   event04   |   2017-01-04	|   2017-01-21 =>  En cours
    5   |   event05   |   2017-01-05	|   2017-01-06 =>  Terminé
    6   |   event06   |   2017-01-06	|   2017-01-22 =>  En cours
    7   |   event07   |   2017-01-21	|   2017-01-24 =>  A venir
    8   |   event08   |   2017-01-08	|   2017-01-09 =>  Terminé
    9   |   event09   |   2017-01-25	|   2017-01-27 =>  A venir
    10 |   event10   |   2017-01-10	|   2017-01-29 =>  En cours
    Je vous file de quoi la créer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    CREATE TABLE `test` (
    	`id` INT(11) NOT NULL AUTO_INCREMENT,
    	`event` VARCHAR(50) NOT NULL DEFAULT '0',
    	`start` DATE NOT NULL DEFAULT '0000-00-00',
    	`end` DATE NOT NULL DEFAULT '0000-00-00',	
    	PRIMARY KEY (`id`)
    )
    ENGINE=MyISAM
    AUTO_INCREMENT=1;
     
    INSERT INTO test (event,start,end)
    VALUES
    ('event01','2017-01-01','2017-01-10'),
    ('event02','2017-01-02','2017-01-25'),
    ('event03','2017-01-26','2017-01-30'),
    ('event04','2017-01-04','2017-01-21'),
    ('event05','2017-01-05','2017-01-06'),
    ('event06','2017-01-06','2017-01-22'),
    ('event07','2017-01-21','2017-01-24'),
    ('event08','2017-01-08','2017-01-09'),
    ('event09','2017-01-25','2017-01-27'),
    ('event10','2017-01-10','2017-01-29');
    Admettons que nous soyons le 20 Janvier 2017.

    Je classe les évènements de cette manière

    - En cours, puis A venir, puis Terminé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SET @date = '2017-01-20';
    SELECT * FROM test  ORDER BY CASE 
    WHEN start < @date AND end > @date THEN 2 
    WHEN start > @date AND end > @date THEN 1 
    ELSE 0 END DESC;
    2	|	event02	|	2017-01-02	|	2017-01-25	=>	En cours
    4	|	event04	|	2017-01-04	|	2017-01-21	=>	En cours
    6	|	event06	|	2017-01-06	|	2017-01-22	=>	En cours
    10	|	event10	|	2017-01-10	|	2017-01-29	=>	En cours
    3	|	event03	|	2017-01-26	|	2017-01-30	=>	A venir
    7	|	event07	|	2017-01-21	|	2017-01-24	=>	A venir
    9	|	event09	|	2017-01-25	|	2017-01-27	=>	A venir
    1	|	event01	|	2017-01-01	|	2017-01-10	=>	Terminé
    5	|	event05	|	2017-01-05	|	2017-01-06	=>	Terminé
    8	|	event08	|	2017-01-08	|	2017-01-09	=>	Terminé
    Jusque là tout va bien...

    Mais j'aimerai affiner le tri pour chaque groupe de statuts

    - Ceux qui sont "En cours", classés par date de fin ASCENDANTE (end ASC)
    - Ceux qui sont "A venir", classés par date de début ASCENDANTE (start asc) - Ceux qui commencent prochainement d'abord
    - Ceux qui sont "Terminé", classés par date de fin DESCENDANTE (end DESC) - Ceux qui viennent de terminer d'abord

    On doit alors retourner un résultat comme celui-ci:

    4	|	event04	|	2017-01-04	|	2017-01-21	=>	En cours
    6	|	event06	|	2017-01-06	|	2017-01-22	=>	En cours
    2	|	event02	|	2017-01-02	|	2017-01-25	=>	En cours
    10	|	event10	|	2017-01-10	|	2017-01-29	=>	En cours
                                                    
    7	|	event07	|	2017-01-21	|	2017-01-24	=>	A venir
    9	|	event09	|	2017-01-25	|	2017-01-27	=>	A venir
    3	|	event03	|	2017-01-26	|	2017-01-30	=>	A venir
                                                    
    1	|	event01	|	2017-01-01	|	2017-01-10	=>	Terminé
    8	|	event08	|	2017-01-08	|	2017-01-09	=>	Terminé
    5	|	event05	|	2017-01-05	|	2017-01-06	=>	Terminé
    Je sais que c'est possible d'imbriquer TROIS SELECT correspondants au trois états classés comme je le souhaite mais peut-on le faire autrement ?
    Un seul SELECT en gardant ou pas ORDER BY CASE.

    J'espère que vous pourrez m'aider !
    C'est je pense un bon exercice aussi pour ceux qui aiment ça ;-)

    A+
    coincoin22

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 010
    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 : 22 010
    Billets dans le blog
    6
    Par défaut
    Avec le cas et une différence de date en jour ou minute ou heure (positive ou négative suivant le sens de tri que vous voulez) , vous devriez vous en sortir.

    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/ * * * * *

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 266
    Par défaut
    Merci pour ta réponse rapide !
    Mais je ne comprends pas trop ce que tu veux me dire ;-)
    Aurais-tu juste une petite piste à me fournir ?
    Merci

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Pas sûr que ce soit syntaxiquement acceptable mais, vite fait, as-tu essayé ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SET @date = '2017-01-20';
    SELECT * 
    FROM test  
    ORDER BY 
    	CASE 
    		WHEN start < @date AND end > @date THEN 2 
    		WHEN start > @date AND end > @date THEN 1 
    		ELSE 0 
    	END DESC,
    	CASE
    		WHEN start < @date AND end > @date THEN end ASC
    		WHEN start > @date AND end > @date THEN start ASC
    		ELSE end DESC
    	END;
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Sinon l'idée de SQLPro était un truc de ce genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SET @date = '2017-01-20';
    SELECT * 
    FROM test  
    ORDER BY 
    	CASE 
    		WHEN start < @date AND end > @date THEN 2 
    		WHEN start > @date AND end > @date THEN 1 
    		ELSE 0 
    	END DESC,
    	CASE
    		WHEN start < @date AND end > @date THEN DATEDIFF(end, @date)
    		WHEN start > @date AND end > @date THEN DATEDIFF(start, @date)
    		ELSE DATEDIFF(@date, end)
    	END ASC;
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 !

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 266
    Par défaut
    Hello !
    Ta première requête renvoie un erreur...
    Quant à la seconde, elle est parfaite !
    Merci encore pour ton aide !

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

Discussions similaires

  1. [SQL-VBA]tri par date dans access
    Par Mickey_Mouse dans le forum VBA Access
    Réponses: 5
    Dernier message: 06/02/2007, 09h49
  2. Optimisation d'un tri par date
    Par padawa dans le forum Requêtes
    Réponses: 7
    Dernier message: 12/05/2006, 15h48
  3. requete : tri par date + groupement
    Par cbe dans le forum Requêtes
    Réponses: 8
    Dernier message: 08/01/2006, 19h30
  4. tri par date
    Par Digiduck dans le forum Requêtes
    Réponses: 5
    Dernier message: 06/06/2005, 21h51
  5. [ XML ][ XSL ] tri par date
    Par zozolh2 dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/08/2004, 10h19

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