Accueil > Forum > > > > Enregistrement suivant
Enregistrement suivant
vendredi 27 juin 2008 à 23:06:19 |
Enregistrement suivant

Farfadh
|
Je souhaite connaitre l'enregistrement suivant à partir d'un enregistrement donné selon un ordre chronologique. Le problème parait être simple, mais en réalité les solutions que l'on serait tenté d'utiliser en premier lieu sont incorrectes. Mettons que j'aie une table d'évènements structurée de la façon suivante : CREATE TABLE " event" ( " cle" int( 10) unsigned NOT NULL, " date" datetime NOT NULL default ' 0000-00-00 00:00:00', " texte" text NOT NULL, PRIMARY KEY (" cle"), ) AUTO_INCREMENT= 1 ; Pour trouver un enregistrement suivant un autre je pourrais utiliser une des deux requêtes suivantes (ou une_cle et une_date sont respectivement la clé et la date de l'enregistrement courant) : SELECT * FROM event WHERE cle> une_cleLIMIT 0, 1 SELECT * FROM event WHERE date> une_dateLIMIT 0, 1Le problème de ces requetes, ce sont les conditions utilisées. Utiliser la clé dans la condition n'est pas valable dans le cas où les dates changent, car dans ce cas, l'ordre des clés ne correspond pas à l'ordre chronologique. Utiliser la date, c'est courir le risque qu'il y ait plusieurs dates identiques dans la table et que dans ce cas, le navigateur d'évènements reste bloqué sur un évènement ou en oublie. Chose improbable, me direz-vous, mais mes codes sont connus pour avoir très peu de failles et le fait de savoir que j'en laisse volontairement une derrière moi me froisse. Je ne tiens pas non plus à limiter ma table en configurant le champs "date" en mode "UNIQUE". Je cherche donc une solution pointue, souple et sûre. L'idéal serait de pouvoir faire une requête avec la date en condition en précisant à quelle clé commencer, sans toutefois devoir utiliser d'opérateur de comparaison pour cette dernière. Vous avez mal à la tête ? Moi aussi. Si seulement le mot clé "LIMIT" acceptait des conditions plutôt que des entiers, ce serait plus simple, car on donnerait à une requête une condition de départ (on limite la sélection au premier enregistrement qui la vérifie) et la condition d'itération (on continue tant que la condition est remplie et qu'il reste des enregistrements) , tout en mettant à disposition une variable prédéfinie OFFSET qui contiendrait donc l'offset de l'enregistrement en cours de traitement par MySQL : SELECT * FROM event WHERE date>= une_date ORDER BY date LIMIT cle= une_cle, OFFSET<= 2Dans cette requête imaginaire, on sélectionnerait toutes les dates à partir d'une date donnée, on les trierait par ordre chronologique (et implicitement par ordre d'insertion dans la table), on limiterait la sélection en commençant par l'enregistrement qui a une clé donnée et en terminant lorsque l'offset atteint 2. Le deuxième enregistrement ainsi sélectionné, s'il existe, serait celui recherché. Ce procédé serait sans faille. Une solution qui marche est de procéder de la manière suivante, avec cet exemple de script en PHP : $cle= // mettre ici la cle de l'enregistrement courant$date= // mettre ici la date de l'enregistrement courant au format SQL 'yyyy-mm-dd hh:mm:ss'$requete= "SELECT * FROM event WHERE date>= '$date'ORDER BY date";$resultat= mysql_query( $requete); //effectuer la requêteif( $resultat) // si la requête est un succès while( $enregistrement= mysql_fetch_array( $resultat)) // alors tant que le résultat de la requête contient des enregistrements if( $enregistrement[ 'cle']== $cle) // vérifier si l'enregistrement est l'enregistrement courant $enregistrement_recherche= mysql_fetch_array( $resultat); // auquel cas l'enregistrement suivant dans le résultat, s'il existe, est celui qu'on cherche
Seulement, cette solution peut s'avérer gourmande en ressources si la table est d'une taille imposante. Pour limiter la casse, on peut effectuer une requête préalable pour connaitre la premiere date strictement supérieure à celle que contient l'enregistrement courant, et ensuite l'utiliser dans la clause "WHERE" de la requête qui cherche les enregistrements suivants pour ne pas sélectionner les dates encore supérieures puisque de toute évidence, elles ne nous intéresseront pas. Tout ceci m'amène enfin à ma question, que vous aurez sûrement deviné : connaissez-vous une manière de traduire ce que je cherche en une requête MySQL, si seulement c'est possible ? Sinon, si vous pensez à un script PHP moins gourmant, bien que je ne vois pas comment c'est possible, je suis également preneur. Désolé d'être aussi exigeant, mais ce n'est pas la première fois que je me prend la tête sur le sujet.
|
|
samedi 28 juin 2008 à 10:43:52 |
Re : Enregistrement suivant

nicomilville
|
Réponse acceptée !
Salut, Pour répondre sincèrement a ta question, non, je ne connais aucune requête qui est capable de faire ce que tu demande, et je ne connais pas non plus de script php plus souple ! Tu as essayé de faire une requête avec CASE et WHEN ? a++ Si la réponse vous convient, pensez : Réponse acceptée ! 
|
|
samedi 28 juin 2008 à 19:56:41 |
Re : Enregistrement suivant

Farfadh
|
Non, je n'avais pas pensé à cette syntaxe. Je vais me pencher dessus mais je ne pense pas que ça fera l'affaire. En théorie, si on utilise une condition WHERE, quelle que soit sa forme, SQL va tenter de la vérifier pour chaque enregistrement. Or, si j'avais imaginé une forme de LIMIT qui utilise des conditions dont la première n'est applicable que jusqu'à ce qu'elle soit vérifiée une première fois, c'est bien parce que lorsque l'on a identifié l'enregistrement "actuel", qui est identifié par une clé, la condition qui se charge de cette identification ne doit plus être utilisée après sinon SQL ne sélectionnera pas l'enregistrement suivant qui est celui qui nous intéresse réellement. On aurait pu également contourner le problème si le SQL était pourvu au moins d'un système de variables, ce qui m'aurait permis de faire une condition plus souple, mais pour autant que je sache, ce n'est pas le cas. C'est pourquoi s'il existe une solution à mon problème, elle passe théoriquement par un mot clé ou une fonction qui ne dépend pas de l'enregistrement en cours de traitement par SQL lors de la requête. Si seulement il était possible d'obtenir l'offset d'un enregistrement au sein d'une table ou d'une sélection, alors on pourrait imbriquer trois SELECT qui feraient respectivement à partir du plus imbriqué : sélection des enregistrements via leur dates à partir de la date de l'enregistrement courant avec tri chronologique, sélection de l'offset de l'enregistrement courant retrouvé au sein de la dernière sélection avec sa clé, et finallement à nouveau sélection via les dates à partir de la date de l'engistrement courant avec tri chronologique mais limité ce coup-ci à un enregistrement avec pour offet celui que l'on a séléctionné plus un. Je crois que je suis confronté à une des nombreuses insuffisances de ce langage qui aurait bien besoin d'une mise à jour majeure. Je ne comprend pas par exemple qu'il ne soit pas pourvu d'un choix plus large de fonctions, comme des fonctions HTML, XML, traitement des accents... Tout l'intérêt d'avoir un gestionnaire de base de données, c'est qu'elle est sencée être optimisée pour effectuer des traitements et des sélections de grandes quantités données. A partir du moment où on nous oblige à travailler dans le script hôte plutôt qu'avec des instructions SQL, il y a une grosse perte de performances. Du reste je trouve que nous obliger à passer par le langage SQL au lieu de nous laisser un contrôle plus manuel de ses fonctionnalités nous impose également une déperdition de performances, puisqu'il faut faire intervenir un analyseur syntaxique dont on aurait très bien pu se passer. Croisons les doigts pour qu'un jour tout ça soit repensé. J'allais vous parler du langage de programmation que j'avais commencé à développer il y a quelques années et que j'espère pouvoir reprendre un jour, mais je crois que le moment est mal choisi pour raconter ma vie et j'ai déjà pollué un autre sujet ce matin. Une autre fois peut-être. Merci nicomilvillepour t'être penché sur la question et d'avoir pris le temps de le comprendre le problème.
|
|
samedi 28 juin 2008 à 21:40:35 |
Re : Enregistrement suivant

nicomilville
|
Re, Tu ne me soul pas, ça ne me dérangerai pas que tu m'en dise plsu sur ton langage... Je vais quand même revenir sur ce que tu as dit a propos des variables, si tu es sous mysql, tu peus utiliser des variables que tu déclare comme ça : SET @variable = 'valeur'; De rien... a++ Si la réponse vous convient, pensez : Réponse acceptée ! 
|
|
dimanche 29 juin 2008 à 03:51:35 |
Re : Enregistrement suivant

Farfadh
|
Réponse acceptée !
Quoi ? Non seulement mon manuel MySQL ne liste que ses chapitres principaux, a un glossaire on ne peut plus incomplet, mais en plus il omet des notions aussi importantes que les variables ? J'hallucine !
Après une documentation plus sérieuse et quelques tests, il n'est pas possible de lire et d'écrire dans une variable au sein de la même instruction. Donc les variables SQL me sont d'une parfaite inutilité. J'ai tenté de ruser mais le fait est que même si on affecte une valeur à une variable à un quelconque emplacement d'une instruction SELECT, on ne pourra récupérer cette valeur qu'à l'instruction suivante, avant quoi la variable garde sa valeur initiale quoi qu'il arrive. Avec une autre version de SQL, j'aurais pu contourner cette limitation, mais bon, je ne vais pas commencer à écrire du code aussi peu portable, c'est un coup à avoir de mauvaises surprises.
De plus, après sérieuse vérification, c'est à dire après avoir parcouru l'intégralité du manuel en ligne de MySQL, il n'existe pas d'option pour la commande SELECT afin de commencer ou terminer la sélection à partir du moment où une condition est remplie. Pas moyen non plus de connaitre l'offset d'un enregistrement au sein d'une table, d'un groupe d'enregistrements ou d'une sélection.
Le sujet est donc à priori clôt, et la seule solution est à priori le script PHP que j'ai donné dans le message original.
Donc on va pouvoir discuter ici à loisir sans se préoccuper des hors sujets. J'expliquerai mon projet de langage de programmation lors de mon prochain passage sur ce site, et pourquoi il est lié à la notion de base de données.
|
|
dimanche 29 juin 2008 à 09:17:35 |
Re : Enregistrement suivant

nicomilville
|
ok, Bonne chance a++ Si la réponse vous convient, pensez : Réponse acceptée ! 
|
|
Cette discussion est classée dans : enregistrement, date, utiliser, requête, cle
Répondre à ce message
Sujets en rapport avec ce message
un gran pb de redondance [ par mehdi911 ]
Mehdi j ai table assid_emp code : code assid matricule :emp date_assid : date d absence
Problème avec une requête [ par emmanuel9 ]
Bonjour à tous, J'ai une table Personne avec dans cette table une colonne "date de création" et ma requete ressemble à ca : "SELECT * FROM PERSONNE WH
Dernier enregistrement de chaque membre [ par Seb33300 ]
BonjourJe cherche a récupérer le dernier enregistrement de chaque membre sur un table de la forme :TABLE(#membre, date, msg)Il fdaudrais donc ainsi po
additionner deux enregistrement d'une meme table [ par Raul duke ]
bonjour,voila, je dispose d'une table contenat des enregistrement du type (Date/famille/ssFamille/compteur1/compteur2).ex.: ID -DATE -FA
requête SQL [ par Marie15 ]
Bonjour,Je cherche à utiliser une requête 'rq1'dans la close 'where' d'une autre requête 'rq2',mais le problème c'est que je veux
INSERT INTO une seule valeur [ par bigondas ]
j'ai un formulaire access fait à partir d'une table seule, le but de ma requête est que lorsque l'on clique sur un bouton, la macro appelée déclenche
Requête SQL : date au format américain [ par Molenn ]
Bonjour, J'ai longtemps hésité entre le forum VB et celui SQL ... J'espère avoir fait le bon choix Je pose vite fait mon problème :Une base SQL Server
Obtenir date de mise à jour [ par Toub63 ]
Bonjour à tous,Est-il possible d'obtenir une date de mise à jour d'un enregistrement via une champ spécial ou autre fonction de SQL server 2000 ?Un e
Récupérer l'id d'une requête et utiliser cette valeur dans une autre requête [ par therainbow3 ]
Bonjour, Je suis entrain de concevoir un programme en C# où je dois créer des requêtes SQL suivant les données du client qui seront par la suite pouss
Ajout de +10 jours dans une date [ par sletouil ]
Bonjour à tous,Je bug sur une requête a la noix, voici ma requête :SELECT info_id, date_modified, field_name, old_value, new_value FROM i
Livres en rapport
|
Derniers Blogs
IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) LES ACTUALITéS DE LA SEMAINE SUR C2I.FR (14 MAI - 20 MAI) par richardc
Mise à jour des Web API du 14 Mai
Réservez dès maintenant votre journée du 20 juin pour le Windows Azure Dev Camp 2012 à Paris
Mise à jour de Team Foundation Service
MechCommander 2 sur Windows 8
Entity Framework 5 Release Candidate e...
Cliquez pour lire la suite de l'article par richardc REACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITERREACTIVE EXTENSIONS : CONSOMMER DES SERVICES AVEC RX PARTIE 3, LES PIèGES à éVITER par Groc
Une mauvaise utilisation de rx lors de l'écriture d'une couche d'accès à des services peut conduire à des cas embarassants avec des erreurs mal gérées, des appels qui ne partent lorsqu'ils le devraient, et même des résultats incorrects . le tout nuis...
Cliquez pour lire la suite de l'article par Groc SHAREPOINT BLOG SITE, PROBLèME D'ARCHIVESSHAREPOINT BLOG SITE, PROBLèME D'ARCHIVES par junarnoalg
Dernièrement, nous avons migré le site
myTIC
vers un nouveau serveur SharePoint 2010. Dans les contenus que nous vouloins récupérer, nous avions un certain nombre de blogs.
Nous avons utilisé les commandes Power...
Cliquez pour lire la suite de l'article par junarnoalg
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|