Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL > Requêtes
Requêtes Forum d'entraide sur les requêtes SQL spécifiques à PostgreSQL, les triggers, les vues, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 29/11/2011, 09h24   #1
Invité régulier
 
Inscription : décembre 2009
Messages : 53
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 53
Points : 8
Points : 8
Par défaut Récupérer une ligne aléatoirement

Bonjour.
Voila mon problème: j'ai une requête qui me retourne plusieurs lignes. Cependant je n'en voudrais qu'une à la fois. Je fais donc un LIMIT 1 à la fin de ma requête.
Problème, dans ce cas, le SGBD me retourne toujours la même ligne. Or je voudrais qu'il récupère à chaque fois une ligne différente.
Peu importe si il choisit la ligne de façon aléatoire ou si il suit un cheminement précis tant que chacune des lignes de ma requête peut être retournée.
Est ce possible à faire, si oui, comment?
Merci d'avance!
Cyanatide est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 09h26   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Bonjour,

Quel est l'utilité / cadre d'un tel procédé ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 09h32   #3
Invité régulier
 
Inscription : décembre 2009
Messages : 53
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 53
Points : 8
Points : 8
Je passe mes requêtes une a une a un outil qui les traite. Cet outils peut créer des erreurs, pour ne pas rappeler toujours la ligne en erreur et ainsi bloquer d'autres lignes potentiellement correctes, je voudrais qu'il puisse en prendre une autre.

J'ai également trouvé la solution, il suffit d'ajouter un ORDER BY random() avant le LIMIT.
Cyanatide est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 09h34   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Bonjour, ne pensez-vous pas que flagger la ligne en erreur serait une meilleure solution ?

Là vous risquez d'appeler 2 fois la même ligne ...


Sinon, pourquoi faire n requêtes alors qu'un curseur (et donc une seule requête) pourrait traiter ceci ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 09h42   #5
Invité régulier
 
Inscription : décembre 2009
Messages : 53
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 53
Points : 8
Points : 8
Les lignes en erreurs sont flaggués, cependant, ces erreurs peuvent être résolues dans un délai plus ou moins grand, aussi, je veux qu'elles soient passées à nouveau à mon outil jusqu’à ce que celui ci les traite complètement. Comme les erreurs peuvent être de différents types, je ne voudrais pas rester bloqué sur une erreur qui mettra six mois a corriger alors que d'autres sont déjà corrigées.

Pour les curseurs, j'avoue ne pas connaitre, il faut que je me renseigne. Tout cours que vous me proposerez sera le bienvenue.
Cyanatide est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 10h11   #6
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Quand vous résolvez une erreur vous déflaggez la ligne en question ?


Un truc "correct" serait de ne traiter que les lignes non flaggées en fait.
Après je ne sais pas comment vous appelez votre outil ni à partir de quoi.


Les curseurs sont un peu la base des traitements itératifs.

Par exemple pour du pgsql : http://www.postgresql.org/docs/9.1/s...l-cursors.html

Mais ceci va varier selon le langage de prog utilisé.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2011, 10h28   #7
Invité régulier
 
Inscription : décembre 2009
Messages : 53
Détails du profil
Informations forums :
Inscription : décembre 2009
Messages : 53
Points : 8
Points : 8
En fait, c'est un programme C++ qui appelle une fonction PHP à l'aide d'un webservice. La fonction PHP exécute la requête dont je parle et récupère une ligne à traiter. Si il n'y a aucune ligne à traiter, il essaye les lignes qui sont déjà passées dans le programme C++ mais qui sont en erreur. Si une ligne a été trouvée, elle est transmise au programme C++.
Du coup je ne pense pas que les curseurs me soient utiles ici puisque les données de PHP sont perdues d'un appel à l'autre.
Cyanatide est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h19.


 
 
 
 
Partenaires

Hébergement Web