Choix aléatoire dans ma bdd

Résolu/Fermé
Lucryio Messages postés 204 Date d'inscription samedi 4 janvier 2014 Statut Membre Dernière intervention 4 juin 2017 - 17 mars 2017 à 20:35
Lucryio Messages postés 204 Date d'inscription samedi 4 janvier 2014 Statut Membre Dernière intervention 4 juin 2017 - 18 mars 2017 à 01:19
Bonjour,

Je viens vers vous afin d'obtenir de l'aide, je m’explique :

J'aimerais faire une sélection de 10 entrées dans ma table mais que ces 10 entrées soit différente.

Par exemple, j'ai 100 entrées "A" 100 entrées "B" 100 entrées "C"

J'aimerais en sélectionner 10 parmi les 300 entrées.

Ma requête :

$sql45 = $bdd->query("SELECT * FROM herbe_normal WHERE map='Route001' AND periode='jour' RAND()");

Fonctionne SAUF qu'elle me sélectionné 10 entrées soit de A, B ou C, hors moi j'aimerais, par exemple, qu'elle me choisisse 3 "A", 4 "B" et 3 "C".

Comment je pourrais faire pour que la sélection se fasse comme je le souhaiterais ?

Merci par avance pour votre aide.


1 réponse

jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705
Modifié par jordane45 le 17/03/2017 à 21:10
Bonjour,
Visiblement ta requête ne contient pas une instruction ORDER BY....

Sachant que pour tester tes requêtes .... tu dois le faire directement dans ta BDD (via phpmyadmin par exemple) et non via ton code php.
ça te permet de te rendre compte plus facilement du résultat et des éventuelles erreurs...

Donc essaye :
SELECT * 
FROM herbe_normal 
WHERE map='Route001' 
  AND periode='jour' 
ORDER BY RAND()
LIMIT 10


Tu peux aussi le faire en utilisant des jointures..
https://www.mysqltutorial.org/mysql-tips/select-random-records-in-database-table/


.
Cordialement, 
Jordane                                                                 
0
Lucryio Messages postés 204 Date d'inscription samedi 4 janvier 2014 Statut Membre Dernière intervention 4 juin 2017
17 mars 2017 à 23:13
Ah oui oui il y à bien ORDER BY RAND() (juste un oublie lors de ma tentative de correction)

Si je fait comme tu as mis, j'ai 10 entrées de la même catégorie du coup hors, je souhaiterais que les 3 catégorie soit mélangé, tu aurais une idée ?
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705 > Lucryio Messages postés 204 Date d'inscription samedi 4 janvier 2014 Statut Membre Dernière intervention 4 juin 2017
17 mars 2017 à 23:39
C'est de l'aléatoire .... tu peux donc avoir que des identiques ...ou pas ..... .... c'est ... aléatoire....

Après... sans connaitre la strucure de ta table ni disposer des données ... je ne peux pas tester.

Mais dis moi... as tu testé aussi avec les jointures du lien que je t'ai donné ??
0
Lucryio Messages postés 204 Date d'inscription samedi 4 janvier 2014 Statut Membre Dernière intervention 4 juin 2017
17 mars 2017 à 23:52
Le souci c'est que ça fait au moins 50 tests que je fais et j'ai toujours 10 entrées de la même catégorie.

les jointures, pas besoin puisque toutes les infos sont dans la même table.
les données de ma table :

-ID(ai, primary)
-no
-nom
-type
-type2
-map
-periode

L'ID correspond à l'auto-incrrément
le no correspond au numèro du pokemon (pour afficher son image)

Donc, moi, je souhaiterais que ma requête selectionne 20 pokemon de cette table mais ci-possible qu'ils soient pas tous identiques.

Tu as une idée ?
0
jordane45 Messages postés 38314 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 24 novembre 2024 4 705 > Lucryio Messages postés 204 Date d'inscription samedi 4 janvier 2014 Statut Membre Dernière intervention 4 juin 2017
18 mars 2017 à 00:14
Lis le lien que je t'ai donné avant de dire que ce n'est pas utile !!!
Lis et tu comprrendras... enfin... normalement ....
0
Lucryio Messages postés 204 Date d'inscription samedi 4 janvier 2014 Statut Membre Dernière intervention 4 juin 2017
18 mars 2017 à 00:27
Je viens en effet de tester avec le LIMIT après le RAND(), dans phpmyadmin ça m'affiche bien 20 résultats non identique donc nickel.

Souci, les 20 résultats je les enregistres dans une table mais là, il me prend qu'un seul resultat et m'enregistre donc 20 fois le même poke et non les 20 entrées séléctionné.

Voici mon for pour enregistrer les 20 entrées :

//requete pour la selection des 20 entrées : 
$sql45 = $bdd->query("SELECT * FROM herbe_normal2 WHERE map='Route001' AND periode='nuit' ORDER BY RAND() LIMIT 20");

//le for qui enregistre les 20 entrées selectionne ci-dessus : 
$don = $sql45->fetch();
			for($don; $nombre_poke <=20; $nombre_poke++)
			{ 
				$sexe = rand(1,2);
				if ($sexe == 1)
				{ 
					$sexe2 = 'Male';
				}elseif ($sexe == 2) 
				{
					$sexe2 = 'Femelle';
				}
				else 
				{
					$sexe = '';
				}

				if($map == "Route001")
				{
					$niveau = rand(1,5);
				}
				$select_charme_chroma = $bdd->query("SELECT COUNT(*) FROM membres_objets WHERE membre_id='".$ID."' AND ID_objet='1176'")->fetchcolumn();
				if ($select_charme_chroma == 1)
				{
					$randChromatique = rand(1,8192);
				}
				else
				{
					$randChromatique = rand(1,16384);
				}
				if($randChromatique == 1)
				{
					$Chromatique = "Chromatique";
				}
				else
				{
					$Chromatique = "";
				}
				$insert_poke_capture = $bdd->exec("INSERT INTO capture VALUES('','".$don['no']."','".$don['nom']."','".$Chromatique."','".$niveau."','".$sexe."','".$don['type']."','".$don['type2']."',
																			  '".$don['map']."','0','".time()."')");
			}


Pour info, toutes les données ne sont pas Identique SAUF le no et le nom qui sont identique.

une idée pour remédier à ce souci ?
0