[MySQL] champs date et suite de row consecutive...

champs date et suite de row consecutive... [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 07-11-2012 à 16:50:54    

Bonjour,
Voici un schéma de base simplifié :


|   date   |  id | flag |
|2012-01-01|  1  |  1   |
|2012-01-02|  1  |  1   |
|2012-01-03|  1  |  1   |
|2012-01-04|  1  |  1   |
|2012-01-04|  2  |  1   |
|2012-01-05|  1  |  1   |
|2012-01-06|  1  |  0   |
|2012-01-07|  1  |  1   |
|2012-01-08|  1  |  1   |
|2012-01-09|  2  |  1   | <= attention, pas d'enregistrement pour le jour 09 / id 1  
|2012-01-10|  1  |  1   |
|2012-01-11|  1  |  1   |
|2012-01-12|  1  |  1   |


En entré j'ai une date et un id, et je voudrais récupérer la date la plus grande suivant celle entré et ayant un flag non nul
Si on entre 2012-01-01 et id 1 => 2012-01-05
Si on entre 2012-01-07 et id 1 => 2012-01-08
Si on entre 2012-01-10 et id 1 => 2012-01-12
Mais je ne vois vraiment pas comment faire...
 
Actuellement je récupère tout en ordre de date croissant, et en php je remplit un array et je break dès que ce n'est plus bon...
 
Une procédure avec une boucle WHILE DATE_ADD(ma_date, INTERVAL 1 DAY) ?
 
Si vous pensez que c'est la bonne méthode un bout de code (ou un lien vers un tuto) pour savoir comment implémenter ça ne serait pas de refus !
 
Merci d'avance...


Message édité par mechkurt le 07-11-2012 à 17:54:48

---------------
D3
Reply

Marsh Posté le 07-11-2012 à 16:50:54   

Reply

Marsh Posté le 07-11-2012 à 16:59:21    

en decomposant ?

 

Dans un select tu recuperes la date de ton 1er flag=0, et tu utilises cette date pour retourner la 1ere date qui est inférieure et qui a un flag=1 ?

 

en pseudo code:

 

select * from table where flag=1 AND date < ( Select date from TABLE where flag=0 ORDER BY date ASC LIMIT 1) LIMIT 1 ORDER BY date DESC


Message édité par youmoussa le 07-11-2012 à 17:01:12

---------------
Galerie HFR - Photoblog San Francisco - American Cars Photos
Reply

Marsh Posté le 07-11-2012 à 17:05:48    

J'ai précisé mon exemple car il y'avait un flou, mais effectivement je crois tenir une piste avec ton raisonnement...


---------------
D3
Reply

Marsh Posté le 07-11-2012 à 17:10:02    

Tu peux utiliser la date de ton formulaire un peu de cette manière
 
select * from table where flag=1 AND date < ( Select date from TABLE where flag=0 AND date >= $MY_DATE ORDER BY date ASC LIMIT 1) LIMIT 1 ORDER BY date DESC


---------------
Galerie HFR - Photoblog San Francisco - American Cars Photos
Reply

Marsh Posté le 07-11-2012 à 17:38:15    

Oui en faite je vais avoir un problème avec cette technique, c'est que si je n'ai pas d’enregistrement flagé à nul après, je ne récupérerais rien du tout (cf. l'exemple 3 que j'ai ajouté).
Merci quand même, je me trouvais con de ne pas avoir pensé à ça...
 
...mais au final ce n'est pas ce qu'il me faut ! ^^


---------------
D3
Reply

Marsh Posté le 07-11-2012 à 17:52:55    

select * from table where flag=1 AND date < ( Select COALESCE(date,sysdate) from TABLE where flag=0 AND date >= $MY_DATE ORDER BY date ASC LIMIT 1) LIMIT 1 ORDER BY date DESC
 
en admettant que tes dates sont anciennes sinon tu prends une date dans le future lointain pour etre tranquille


---------------
www.pronovolley.fr Faites vos prono sur la ligue de Volley et défiez vos amis. Des cadeaux en fin d'année  www.levoll.fr
Reply

Marsh Posté le 07-11-2012 à 17:59:08    

Même réponse qu'au dessus, dans la mesure ou je veux une dernière date "existante", cherche un enregistrement vide m'entraine droit dans le mur...
 
D’ailleurs je me suis aperçu en cherchant de mon coté que le problème est encore plus compliqué, il faut chercher les flag a zéro ou les lignes manquantes (cf. exemple 2 ci-dessus).
 
Même en php je suis obligé de vérifier qu'il n'y a pas de trou bizarre dans les enregistrements que je récupère...


---------------
D3
Reply

Marsh Posté le 07-11-2012 à 18:36:26    

une fonction genre MIN entre une valeure nulle et une date renvoit la date ? /pense à voix haute

 

Sinon, il est clair qu'il va falloir écrire tous les cas avant qu'on ne puisse t'aider plus.


Message édité par youmoussa le 07-11-2012 à 18:37:05

---------------
Galerie HFR - Photoblog San Francisco - American Cars Photos
Reply

Marsh Posté le 08-11-2012 à 09:44:40    

Si on trouve une manip qui résout les 3 cas de mon premier post, je pense qu'on sera quasi bon.
Honnêtement à part faire en SQL ce que je fait en PHP, c'est à dire parcourir les lignes dans l'ordre croissant et en interrompant soit quand "on saute un ou plusieurs jours", soit quand on a un flag à zéro, je ne vois vraiment pas ce qui pourrait fonctionner...
 
Mais faire ça en SQL est au dessus de mes compétences et je ne suis pas sur qu'il y ait un gain de performance "globale" significatif !


---------------
D3
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed