OVH Cloud OVH Cloud

[mysql] un petit conseil SVP

14 réponses
Avatar
GB
Par une requête mysql je selectionne un certain nombre d'enregistrements
mais je souhaite n'en selectionner qu'un seul. Ils'agit d'une table
contenant les coordonnées de photos prises à certaines dates.
Comment faire pour afficher aléatoirement un des enregistrements
selectionnés et non pas toujours le premier.
J'ai cherché par moi-même plusieurs solutions mais je n'y arrive pas.
Si quelqu'un veut bien m'aider, ça serait sympa.

D'avance merci

Guillaume

4 réponses

1 2
Avatar
Bruno Baguette
JustMe a écrit :
Bruno Baguette a formulé ce mercredi :
JustMe a écrit :

Faites plutôt un "SELECT COUNT(*) FROM photos where
date='$row[date]'", ce sera moins gourmand en ressources...



Ou plutot un select(1) qui est encore moins gourmant ;-)



Mmmh , tu voulais dire un SELECT COUNT(1), je présume ?



Ton logiciel de coloriage ne tiens pas compte des cancel et des
supersedes ? ;-)



Effectivement, je le vois sur Google...

Je ne sais pas si c'est mon logiciel de coloriage qui a omit de vérifier
ca ou si c'est le serveur de news que j'utilise qui n'a pas honoré ton
cancel et ton supersedes.

Désolé :-|


--
Bruno BAGUETTE -

"Nous n'avons pas à garantir la sécurité des
produits alimentaires génétiquement modifiés (OGM).
Notre intérêt est d'en vendre le plus possible."

Propos de Monsanto, in le Monde Diplomatique, Décembre 98.
Avatar
GB
Merci pour ce cours particulier.
Par curiosité : En quoi est-ce mieux d'utiliser cette méthode plutôt que de
compter le nombre d'enregistrements avec mysql_num_row() ?

Guillaume


"Bruno Baguette" a écrit dans le message de news:

GB a écrit :
Je continue dans mes questions d'amateur (mais il parait qu'il n'y a pas
de questions idiotes...)



Il n'y a pas de questions idiotes, par contre ce serait idiot de ne pas
les poser :-)

Lorsque je fais un SELECT COUNT(1) ou (*) j'obtiens : Resource id # avec
un chiffre à suivre.
Pourquoi et comment exploiter ce résultat ?
Pour l'instant j'utilise toujour le mysql_query() et ensuite
mysql_num_row()



C'est un peu différent. Par rapport à votre premier message, vous ne devez
plus récupérer un nombre d'enregistrements retournés par PHP, mais bien un
résultat provenant d'une requête SQL.

Je reprend un peu votre code :

###

// On modifie un poil la requête pour ajouter un alias au COUNT
$photo=mysql_query("SELECT COUNT(1) AS nbre_photos FROM photos where
date='$row[date]'");

//Cette ligne ne sert plus maintenant
//$nb = mysql_num_rows($photo);

if($photo!=úLSE)
{
// La requête s'est bien passée
// ==> On récupère le résultat
$TupleComptagePhoto = mysql_fetch_assoc($photo);
// On récupère les valeurs retournées par la requête
// en se servant du nom de la colonne
$nb = $TupleComptagePhoto['nbre_photos'];
srand((double)microtime()*1000000);
$nb=$nb-1;
$rand=rand(0,$nb);
$row2=mysql_fetch_array(mysql_query("SELECT * FROM photos where
date='$row[date]' LIMIT $rand,1"));
}
else
{
// Une erreur SQL à eu lieu
// ==> Faire un traitement de cette erreur (affichage d'un message
d'erreur ou autre...)
}

###

Notez que ce code fonctionnera tant qu'il s'agit de requêtes qui vous
retournent *à coup sûr* (un count() renvoie toujours quelque chose) un et
un seul tuple (=enregistrement).

Ceci dit, on sort maintenant du cadre du forum, je vous invite donc à
poser vos questions relatives à PHP sur fr.comp.lang.php (forum modéré,
donc un délai peut s'écouler entre l'envoi de votre message et sa
publication sur le forum), et de garder ce forum ci pour vos questions
relatives à vos requêtes SQL.

Tant que je suis HS, autant achever le sacrilège, vous devriez faire
attention à la gestion d'erreur lorsque vous faites des requêtes SQL en
PHP. (suis-je bien connecté ? est-ce que la requête s'est bien passée
?,...), ca vous facilitera les futurs débuggages :-)

En espérant que ca aide ! ;-)

PS : Code non testé, vous aurez peut-être un parse error ou l'autre à
corriger.

--
Bruno BAGUETTE -

"Nous n'avons pas à garantir la sécurité des
produits alimentaires génétiquement modifiés (OGM).
Notre intérêt est d'en vendre le plus possible."

Propos de Monsanto, in le Monde Diplomatique, Décembre 98.
Avatar
Bruno Baguette
GB a écrit :
Merci pour ce cours particulier.
Par curiosité : En quoi est-ce mieux d'utiliser cette méthode plutôt que de
compter le nombre d'enregistrements avec mysql_num_row() ?



En comptant le nombre d'enregistrements avec mysql_num_rows(), vous
rapatriez TOUTES les données (via votre SELECT *) et donc vous consommez
*inutilement* de la mémoire (voire même de la bande passante si la base
de données se trouve sur un autre serveur que votre script) alors que
vous ne vouliez en fin de compte que connaitre le nombre de données, et
non pas les données en elles-même.

Tandis qu'en faisant un COUNT(), vous ne recevrez que le nombre que vous
souhaitiez savoir (et non pas toutes les données).

C'est comme si vous demandiez à un fournisseur de vous envoyer toute la
liste des fromages qu'il dispose, pour connaitre le nombre de fromage
qu'il a. C'est plus rapide de lui demander directement qu'il vous donne
le nombre de fromages qu'il a :-)

Bien à vous,

--
Bruno BAGUETTE -

"Nous n'avons pas à garantir la sécurité des
produits alimentaires génétiquement modifiés (OGM).
Notre intérêt est d'en vendre le plus possible."

Propos de Monsanto, in le Monde Diplomatique, Décembre 98.
Avatar
GB
Merci pour l'explication, ça fonctionne bien et en plus j'ai le sentiment
d'utiliser les "bonnes pratiques".
Pouvez-vous me conseiller un site internet ou un ouvrage papier qui
recenserait ces bonnes pratiques afin d'éviter les bidouillages qui
fonctionnent mais qui sont trop gourmands en terme de ressources.

Guillaume


"Bruno Baguette" a écrit dans le message de news:

GB a écrit :
Merci pour ce cours particulier.
Par curiosité : En quoi est-ce mieux d'utiliser cette méthode plutôt que
de compter le nombre d'enregistrements avec mysql_num_row() ?



En comptant le nombre d'enregistrements avec mysql_num_rows(), vous
rapatriez TOUTES les données (via votre SELECT *) et donc vous consommez
*inutilement* de la mémoire (voire même de la bande passante si la base de
données se trouve sur un autre serveur que votre script) alors que vous ne
vouliez en fin de compte que connaitre le nombre de données, et non pas
les données en elles-même.

Tandis qu'en faisant un COUNT(), vous ne recevrez que le nombre que vous
souhaitiez savoir (et non pas toutes les données).

C'est comme si vous demandiez à un fournisseur de vous envoyer toute la
liste des fromages qu'il dispose, pour connaitre le nombre de fromage
qu'il a. C'est plus rapide de lui demander directement qu'il vous donne le
nombre de fromages qu'il a :-)

Bien à vous,

--
Bruno BAGUETTE -

"Nous n'avons pas à garantir la sécurité des
produits alimentaires génétiquement modifiés (OGM).
Notre intérêt est d'en vendre le plus possible."

Propos de Monsanto, in le Monde Diplomatique, Décembre 98.
1 2