France Hardware : Forums de discussion - Découvrez notre nouveau comparateur d'offres Internet
Retrouvez les prix près de chez vous :  
Index du forum | Liste des membres | Liste des groupes | Inscription | F-A-Q | Recherche
Pseudo :    Password :     
29 521 membres enregistrés - 2 069 420 posts - 122 057 topics
Index des forums FH  | Index des forums DegroupNews
      Programmation
           Bases de données
                Equivalent d'un getnext ou next en mysql ?
53 connectés(record : 2799 le 29 May 2016 - 15 h 34)

Vous devez vous connecter pour répondre au topic.
1,2,3 | Suivant
Equivalent d'un getnext ou next en mysql ?

Yan


Messages : 924
Inscrit le 10/06/02
Ville : Grenoble
Non connecté
  Posté le 22 January 2007 - 11 h 11 m 01 s
Bonjour, je debute en php/mysql et je suis un peu perdu pour un truc qui est trés simple à faire dans d'autres SGBD qui integrent des fonctions préprogrammé.
En gros je voudrais l'equivalent d'un getnext (dans btrieve par exemple si certains connaissent) mais pour mysql. Le getnext permet de passer à l'enregistrement suivant par rapport à l'index.
J'explique un peu plus pourquoi je n'utilise pas mysql_fetch... dans ce cas car la base de donnée fait plus d'un millions d'enregistrements donc je veux me placer sur 1 et 1 seule ligne à l'aide d'un select..where et ensuite passer au enregistrement suivant jsuqu'a ce qu'une condition soit bonne pour m'arreter.

Voila si quelqu'un a compris et peux m'aider, merci ;)



Humour Videos Buzz
Location Autrans
Images insolites


Woofy
Totalement inutile, complètement indispensable

Messages : 31 551
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 22 January 2007 - 11 h 47 m 47 s
Pourquoi tu n'utiliserais pas un LIMIT ?
Ah ptet que le LIMIT fais le tri après requête, c'est fort possible !




Yan


Messages : 924
Inscrit le 10/06/02
Ville : Grenoble
Non connecté
  Posté le 22 January 2007 - 16 h 42 m 45 s
Non le limite permet bien de ne pas allourdir la requette et de lire les millions d'enregistrement, le seul hic c'est que je n'ai pas de limite fixe. Je me positionner à 1 un enregistrement X et ensuite parcourir les suivant jusqu'a ce qu'une condition soit rempli. Donc je peux avoir à en lire 2 aprés comme 30 :s
Et je ne peux pas faire de requete sur ma clef pour lire l'enregistrement suivant c'est pas une clef banale 1,2,3...
Donc il faudrait soit que je trouve une fonction qui fasse directement next, soit une qui me recupere l'index de l'enregistrement suivant pour pouvoir le selectionner avec un select.



Humour Videos Buzz
Location Autrans
Images insolites


Woofy
Totalement inutile, complètement indispensable

Messages : 31 551
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 22 January 2007 - 16 h 46 m 46 s
Bah LIMIT prend un offset aussi en paramètre.
Il suffit donc de faire ta requête a chaque fois que l'enregistrement ne marche pas, non ?




Yan


Messages : 924
Inscrit le 10/06/02
Ville : Grenoble
Non connecté
  Posté le 22 January 2007 - 20 h 48 m 32 s
Tu peux me donner un exemple avec le code stp



Humour Videos Buzz
Location Autrans
Images insolites


Woofy
Totalement inutile, complètement indispensable

Messages : 31 551
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 22 January 2007 - 21 h 00 m 35 s
Déjà a lire : http://dev.mysql.com/doc/refman/5.0/fr/limit-optimization.html
J'espère que tu n'as pas de HAVING dans tes requêtes.


    Code     
 1. $start = 0;
 2. $nb= 1; // pour définir le nombre d'enregistrement a prendre a chaque requête.
 3. do
 4. {
 5. $sql = "SELECT `mes champs` INTO `ma table` WHERE `mon champ`='ma condition' LIMIT $start , $nb'";
 6. $res = mysql_query($sql) or die ("<b>Erreur</b> : $sql<br/>" . mysql_error());
 7. $result = mysql_fetch_array($res);
 8. 
 9. /* ...
10. Traitement de ton résultat
11.  pour sortir la condition d'arrêt
12. ... */
13. $start++;
14. 
15. } while ($maConditionDArret != "ce que je cherche")


Quelque chose dans le genre, non ?


Message édité 3 fois, la dernière par Woofy le 22 January 2007 - 23 h 36.


Yan


Messages : 924
Inscrit le 10/06/02
Ville : Grenoble
Non connecté
  Posté le 22 January 2007 - 23 h 33 m 10 s
Je ne peux pas tester de suite, car j'ai pas accés a la base pour l'instant mais à premiere vue je dirais que ca ressemble à ce que je veux faire mise à part un seul truc sur la requete.
J'accede au premier enregistrement par la clef primaire et je veux passer à l'enregistrement suivant uniquement si une condition sur l'enregistrement n'est pas remplie. Donc il faudrait que j'arrive à lire l'enregistrement suivant soit par sa clef primaire (que je n'ai pas :s) soit sans condition et avec limit start+1,1



Humour Videos Buzz
Location Autrans
Images insolites


Woofy
Totalement inutile, complètement indispensable

Messages : 31 551
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 22 January 2007 - 23 h 43 m 12 s
Disons que tu va executer ta requête a chaque fois du début, et t'arrêter dès que tu trouve le bon enregistrement.
Je ne sais pas comment marche le NEXT, mais ici, d'après ce que j'ai compris (je peux me tromper), LIMIT va compter et décrémenter la valeur a laquelle il doit commencer ($start) jusqu'a ce qu'il atteigne 0, auquel cas il commencera a prendre les valeurs en compte. Et il va continuer cette fois en décrémentant le nombre de valeurs qu'il doit prendre ($nb) jusqu'a ce qu'il tombe a 0 (donc s'il a 1 il n'en prendra qu'un seul).
Donc a chaque fois tu commence du début. Mais ça t'épargne d'avoir la fin a parcourir, c'est déjà ça !




Yan


Messages : 924
Inscrit le 10/06/02
Ville : Grenoble
Non connecté
  Posté le 23 January 2007 - 17 h 00 m 05 s
Je n'ai pas tout saisis dans ton ancien post :???:
Le probleme que je voyais par rapport au code que t'as mis, c'est que pour ma deuxieme requete.
exemple :
dans la boucle {
SELECT * FROM TEST WHERE 'CLEFPRIMAIRE'='12A' LIMIT 0 , 1
traitement...}

et aux passages suivant dans la boucle
{SELECT * FROM TEST WHERE 'CLEFPRIMAIRE'='12A' LIMIT 0 , 2
traitement...
}

ainsi de suite sauf que la condition 'CLEFPRIMAIRE'='12A' n'est plus bonne aprés le premier passage donc le fait d'augmenter l'offset ne me change rien. A la premiere j'ai un enregistrement c'est ok, mais a la deuxieme j'ai toujours un seul enregistrement en resultat ce qui est normal vu que la condition n'est pas remplie pour l'enregistrement suivant :s



Humour Videos Buzz
Location Autrans
Images insolites


Yan


Messages : 924
Inscrit le 10/06/02
Ville : Grenoble
Non connecté
  Posté le 23 January 2007 - 17 h 07 m 10 s
Pour moi d'aprés ce que j'ai vu du LIMIT, c'est qu'il ne fait que traiter le resultat e la requette. Si il y a 10 tuples de retourné, LIMIT 0,10 ou LIMIT 0,100 affiche les 10 tuples, si LIMIT 0,5 il affiche que les 5 premiers, et si LIMIT 2,3 il affiche du 3eme au 6eme.



Humour Videos Buzz
Location Autrans
Images insolites


Yan


Messages : 924
Inscrit le 10/06/02
Ville : Grenoble
Non connecté
  Posté le 23 January 2007 - 17 h 32 m 49 s
Voila ce que j'ai trouvé par rapport à ma question http://dreamweaver.media-box.net/lofiversion/index.php/t10536.html qui pourrait peut être mieux te montrer ce que je veux. Malheuresement je ne peux pas utiliser la solution présente sur ce site car ma clef n'est pas de type 1,2,3... donc impossible de placer un compteur et de regarder si l'enregistrement existe :(



Humour Videos Buzz
Location Autrans
Images insolites


Woofy
Totalement inutile, complètement indispensable

Messages : 31 551
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 23 January 2007 - 20 h 05 m 48 s
Entre ce que LIMIT t'affiche et ce qui est traité, il y a une différence !

Avec le next, tu ferais ta requête comment ?




Yan


Messages : 924
Inscrit le 10/06/02
Ville : Grenoble
Non connecté
  Posté le 23 January 2007 - 23 h 24 m 42 s
Btrieve tourne sur un moteur sql avec une couche au dessus ou on a les fonction getfirst, getnext ...
Voila comment je l'aurai fait sous btrieve et un langage objet

monfichier.indexnumber=1 //je selectionne ma clef
monfichier.getfirst //je me place au debut de ma table selon l'index 1
monfichier.fieldvalue("MACLEF")=le_numero_de_mon_enregistrement
monfichier.getequal // se place sur l'enregistrement
ok=false
while not ok and monfichier.status=0 //status=0 en btrieve c'est que l'enregistrement existe
//traitement qui fera passer ok à true au bout de N enregistrement lus
monfichier.getnext //passe à l'enregistrement suivant toujours par rapport a la clef 1
wend

Voila je ne trouve pas d'equivalent dans mysql pour passer d'un enregistrement a un autre en suivant une clef qui n'est pas 1,2,3...



Humour Videos Buzz
Location Autrans
Images insolites


Woofy
Totalement inutile, complètement indispensable

Messages : 31 551
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 23 January 2007 - 23 h 31 m 42 s
Ah mais en gros, tu veux juste prendre les enregistrements de ta table un par un, et avancer jusqu'a ce que tu trouve le bon ?




Loading
Coordinateur
Chef de projet IS

Messages : 5 531
Inscrit le 21/09/02
Ville : Lyon
Non connecté
  Posté le 23 January 2007 - 23 h 51 m 47 s
hum je peux me permettre?

tu requetes toutes les clefs dans un tableau (tu tris en sql), en gradant l'indexation du tableau par défaut (0,1,2..) et dans tes liens (ou autre) tu te déplace dans le tableau (next -> http://fr3.php.net/manual/fr/function.next.php) ;)




Woofy
Totalement inutile, complètement indispensable

Messages : 31 551
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 24 January 2007 - 00 h 00 m 53 s
Oui mais bon tu fais la requête sur la totalitée de la base, c'est ptet pas génial !
Sinon, Yan, tu sais que tu peux faire un WHERE sur autre chose que la clef primaire ?




Loading
Coordinateur
Chef de projet IS

Messages : 5 531
Inscrit le 21/09/02
Ville : Lyon
Non connecté
  Posté le 24 January 2007 - 06 h 49 m 41 s
j'vois pas comment tu peux faire des liens à partir d'une suite non consécutive et en se basant sur celle-ci sans connaitre la liste entière dès le départ... ?
et je vois pas le rapport avec "la requete sur la totalité de la base", je crois pas qu'on causait d'une base entière mais simplement d'une table... de liens de plus... bref tu me cause de microseconde d'execution... sans parler que ce n'est pas présenté comme une contrainte, il veut une soluce je lui en donne une... si t'as mieux propose sans te moquer stp !




Loading
Coordinateur
Chef de projet IS

Messages : 5 531
Inscrit le 21/09/02
Ville : Lyon
Non connecté
  Posté le 24 January 2007 - 06 h 54 m 28 s
Yan > je comprends dans ton premier post que tu va passer 1 requete après l'autre alors que tu pourrais n'en passer qu'une seule, c bien ça?




Woofy
Totalement inutile, complètement indispensable

Messages : 31 551
Inscrit le 11/01/02
Ville : Lyon
Non connecté
  Posté le 24 January 2007 - 08 h 35 m 44 s


Le 24 janvier 2007 - 06 h 49, Loading a écrit :
j'vois pas comment tu peux faire des liens à partir d'une suite non consécutive et en se basant sur celle-ci sans connaitre la liste entière dès le départ... ?
et je vois pas le rapport avec "la requete sur la totalité de la base", je crois pas qu'on causait d'une base entière mais simplement d'une table... de liens de plus... bref tu me cause de microseconde d'execution... sans parler que ce n'est pas présenté comme une contrainte, il veut une soluce je lui en donne une... si t'as mieux propose sans te moquer stp !

Totalitée de la table ouais désolé.
Bah d'après ses dires, il a une table de plusieurs millions d'enregistrements. En même temps, pour une base de cette taille, y aurait ptet plutôt un DBA que quelqu'un qui ne connais pas le SQL.
Sinon je ne vois pas où je me moque.
Et je ne comprend toujours pas ce qu'il veux faire, on peux pas avoir un détail des champs de la table, et du type de tuple qu'il y a dedans ?




Erel69
- Ancien Modérateur -
Fantôme
Officiel

Messages : 19 554
Inscrit le 07/11/01
Ville : Lyon
Non connecté
  Posté le 24 January 2007 - 09 h 04 m 04 s
Et ces quoi ces conditions d'arrêt qui ne peuvent pas être incluse dans le WHERE ?




1,2,3 | Suivant
Page genérée en 0.2234 secondes par RahForum 2.0 | Gzip off |  Stats |  Metaforums |  RSS
© 2004 Cerbere Systems.
Prix Matériel Informatique | Informatique Lyon | Informatique Grenoble | Informatique Annecy | Informatique Marseille | Informatique Bordeaux | Forum Informatique
ADSL | Actualité ADSL | Deligo | Appareil photo | Commande Au Volant
Creative Commons
Message Boards and Forums Directory