Sélection dans une base de donnée

Résolu
Bonjour,

J'aimerai votre aide afin de m'aider à réaliser une sélection dans ma bdd en fonction de certains paramètres.

Je vais nommer 5 Objets : A, B, C, D et E.
- Je souhaiterai que ces 5 Objets soit entrés en bdd (je sais faire, aucun souci).
- Je souhaiterai qu'une fonction php sélectionne, disons, 30 Objets en tous en prenant en compte ce quota : 50% de A, 20% de B, 15% de C, 10% de D et 5% de E.
- Insérer le résultat de sélection des 30 Objets dans une autre table (je sais faire avec une boucle while).

pouvez-vous m'aiguiller sur la marche à suivre s'ils vous plait ?

Merci par avance.

6 réponses

  1. Oui mais ce n'est pas bon.
    et j'ai perdu mon fichier.

    En faite je souhaite que le tirage se fasse en fonction du taux de chaque objet.
    1. Contributeur
      moi je ferais des tirages indépendants pour chaque type d'objet: tirer 15 A, 6 B, ...
  2. J'ai ça pour le moment :

    //Enregistrement de 30 pokemon dans une table pour affichage au joueur
    		$nbr_poke = 0 ;
    		while( $nbr_poke < 30)
    				{ 
    					$poke_affich_joueur = $bdd->query("SELECT * FROM selec_poke ORDER BY RAND()LIMIT 30");
    					$poke_entrer = $poke_affich_joueur->fetch();
    					$randChromatique = rand(1,50);
    					$niveau = rand(13,17);
    					$sexe = rand(1,2);
    					if ($sexe == 1)
    					{ 
    						$sexe2 = 'Male';
    					}elseif ($sexe == 2) 
    					{
    						$sexe2 = 'Femelle';
    					}
    					else 
    					{
    						$sexe = 'Inconnu';
    					}
    					if($randChromatique == 1)
    					{
    						$Chromatique = "chromatique";
    					}
    					else
    					{
    						$Chromatique = "";
    					}
    					$insert_poke_capture = $bdd->exec("INSERT INTO herbe (`no_poke`, `nom`, `lvl`, `sexe`, `chroma`) VALUES('".$poke_entrer['no_poke']."', '".$poke_entrer['nom']."', '".$niveau."', '".$sexe2."', '".$Chromatique."')");
    					$nbr_poke++; 
    				}
    		header('location:test_affiche.php');
    


    Comment adapter ce code pour sélectionner en fonction du taux que je souhaite ?
    1. Je ne peux plus éditer alors je poste ce commentaire :

      Voici la table ou je selectionne les pokemon :
  3. Alors voila, en suivant tes conseils je suis parvenu à faire ça :

    //Enregistrement de 30 pokemon dans une table pour affichage au joueur
    		$nbr_poke = 0 ;
    		while( $nbr_poke < 30)
    				{ 
    					$taux_poke = rand(1,100);
    					if ($taux_poke <= 50)
    						{
    							$poke_affich_joueur = $bdd->query('SELECT * FROM selec_poke WHERE taux = "1"');
    							$poke_entrer = $poke_affich_joueur->fetch();
    							$randChromatique = rand(1,15);
    							$niveau = rand(12,18);
    							$sexe = rand(1,2);
    							if ($sexe == 1)
    							{ 
    								$sexe2 = 'Male';
    							}elseif ($sexe == 2) 
    							{
    								$sexe2 = 'Femelle';
    							}
    							else 
    							{
    								$sexe = 'Inconnu';
    							}
    							if($randChromatique == 1)
    							{
    								$Chromatique = "chromatique";
    							}
    							else
    							{
    								$Chromatique = "";
    							}
    						}
    					elseif (($taux_poke >= 51) && ($taux_poke <=70))
    						{
    							$poke_affich_joueur = $bdd->query('SELECT * FROM selec_poke WHERE taux = "2"');
    							$poke_entrer = $poke_affich_joueur->fetch();
    							$randChromatique = rand(1,15);
    							$niveau = rand(9,14);
    							$sexe = rand(1,2);
    							if ($sexe == 1)
    							{ 
    								$sexe2 = 'Male';
    							}elseif ($sexe == 2) 
    							{
    								$sexe2 = 'Femelle';
    							}
    							else 
    							{
    								$sexe = 'Inconnu';
    							}
    							if($randChromatique == 1)
    							{
    								$Chromatique = "chromatique";
    							}
    							else
    							{
    								$Chromatique = "";
    							}
    						}
    					elseif (($taux_poke >= 71) && ($taux_poke <=85))
    						{
    							$poke_affich_joueur = $bdd->query('SELECT * FROM selec_poke WHERE taux = "3"');
    							$poke_entrer = $poke_affich_joueur->fetch();
    							$randChromatique = rand(1,15);
    							$niveau = rand(5,11);
    							$sexe = rand(1,2);
    							if ($sexe == 1)
    							{ 
    								$sexe2 = 'Male';
    							}elseif ($sexe == 2) 
    							{
    								$sexe2 = 'Femelle';
    							}
    							else 
    							{
    								$sexe = 'Inconnu';
    							}
    							if($randChromatique == 1)
    							{
    								$Chromatique = "chromatique";
    							}
    							else
    							{
    								$Chromatique = "";
    							}
    						}
    					elseif (($taux_poke >= 86) && ($taux_poke <=95))
    						{
    							$poke_affich_joueur = $bdd->query('SELECT * FROM selec_poke WHERE taux = "4"');
    							$poke_entrer = $poke_affich_joueur->fetch();
    							$randChromatique = rand(1,15);
    							$niveau = rand(3,8);
    							$sexe = rand(1,2);
    							if ($sexe == 1)
    							{ 
    								$sexe2 = 'Male';
    							}elseif ($sexe == 2) 
    							{
    								$sexe2 = 'Femelle';
    							}
    							else 
    							{
    								$sexe = 'Inconnu';
    							}
    							if($randChromatique == 1)
    							{
    								$Chromatique = "chromatique";
    							}
    							else
    							{
    								$Chromatique = "";
    							}
    						}
    					else
    						{
    							$poke_affich_joueur = $bdd->query('SELECT * FROM selec_poke WHERE taux = "5"');
    							$poke_entrer = $poke_affich_joueur->fetch();
    							$randChromatique = rand(1,15);
    							$niveau = rand(1,5);
    							$sexe = rand(1,2);
    							if ($sexe == 1)
    							{ 
    								$sexe2 = 'Male';
    							}elseif ($sexe == 2) 
    							{
    								$sexe2 = 'Femelle';
    							}
    							else 
    							{
    								$sexe = 'Inconnu';
    							}
    							if($randChromatique == 1)
    							{
    								$Chromatique = "chromatique";
    							}
    							else
    							{
    								$Chromatique = "";
    							}
    						}
    					
    					$insert_poke_capture = $bdd->exec("INSERT INTO herbe (`no_poke`, `nom`, `lvl`, `sexe`, `chroma`) VALUES('".$poke_entrer['no_poke']."', '".$poke_entrer['nom']."', '".$niveau."', '".$sexe2."', '".$Chromatique."')");
    					$nbr_poke++; 
    				}
    		header('location:test_affiche.php');


    Cela fonctionne parfaitement avec ce que je cherche par contre j'aimerais savoir si vous pouviez m'aiguillez sur le fait de simplifier ce code ?

    Merci par avance.
    1. Contributeur
      la première chose à faire et de sortir du if tout ce qui est identique dans les différents cas.
    2. @yg_bee suis d'accord avec toi mais par exemple le niveau ou le sexe doit être calculer à chaque tours du while par exemple tous comme la caractéristique chromatique.
    3. Contributeur
      @David987ce qui ne nécessite pas de l'avoir dans chaque condition du if. tu peux le mettre entre la fin du if et la fin du while.
  4. Ah oui je comprend je vais faire ça.
    Tu vois autre chose pour améliorer et réduire le code ?

    Voici ce que j'ai fais pour le moment :

    $select_time_actu = $bdd->query("SELECT * FROM temps_actu WHERE time")->fetch();
    		$time_derniere_actu = $select_time_actu['time'];
    		if(time() - $time_derniere_actu < 10)
    			{}
    		else
    		{
    				//Enregistrement de 30 pokemon dans une table pour affichage au joueur + update du temps de l'actu
    				$update_time_actu = $bdd-> exec("UPDATE temps_actu SET time = '".time()."'");
    				$vider_table = $bdd->exec("TRUNCATE herbe");
    				$map = "Nazaris";
    				$nbr_poke = 0 ;
    				while( $nbr_poke < 30)
    						{ 
    							$taux_poke = rand(1,100);
    							$sexe = rand(1,2);
    									if ($sexe == 1)
    									{ 
    										$sexe2 = 'Male';
    									}elseif ($sexe == 2) 
    									{
    										$sexe2 = 'Femelle';
    									}
    									else 
    									{
    										$sexe = 'Inconnu';
    									}
    									if($randChromatique == 1)
    									{
    										$Chromatique = "chromatique";
    									}
    									else
    									{
    										$Chromatique = "";
    									}
    							$randChromatique = $chance_chroma;
    							if ($taux_poke <= 50)
    								{
    									$poke_affich_joueur = $bdd->query('SELECT * FROM selec_poke WHERE taux = "1" && map="'.$map.'"');
    									$poke_entrer = $poke_affich_joueur->fetch();
    									$niveau = rand(12,18);
    								}
    							elseif (($taux_poke >= 51) && ($taux_poke <=70))
    								{
    									$poke_affich_joueur = $bdd->query('SELECT * FROM selec_poke WHERE taux = "2" AND map="'.$map.'"');
    									$poke_entrer = $poke_affich_joueur->fetch();
    									$niveau = rand(9,14);
    								}
    							elseif (($taux_poke >= 71) && ($taux_poke <=85))
    								{
    									$poke_affich_joueur = $bdd->query('SELECT * FROM selec_poke WHERE taux = "3" AND map="'.$map.'"');
    									$poke_entrer = $poke_affich_joueur->fetch();
    									$niveau = rand(5,11);
    								}
    							elseif (($taux_poke >= 86) && ($taux_poke <=95))
    								{
    									$poke_affich_joueur = $bdd->query('SELECT * FROM selec_poke WHERE taux = "4" AND map="'.$map.'"');
    									$poke_entrer = $poke_affich_joueur->fetch();
    									$niveau = rand(3,8);
    								}
    							else
    								{
    									$poke_affich_joueur = $bdd->query('SELECT * FROM selec_poke WHERE taux = "5" AND map="'.$map.'"');
    									$poke_entrer = $poke_affich_joueur->fetch();
    									$niveau = rand(1,5);
    								}
    							
    							$insert_poke_capture = $bdd->exec("INSERT INTO herbe (`no_poke`, `nom`, `lvl`, `sexe`, `chroma`, `map`) VALUES('".$poke_entrer['no_poke']."', '".$poke_entrer['nom']."', '".$niveau."', '".$sexe2."', '".$Chromatique."', '".$map."')");
    							$insert_poke_capture_archive = $bdd->exec("INSERT INTO archive_herbe (`no_poke`, `nom`, `lvl`, `sexe`, `chroma`, `map`) VALUES('".$poke_entrer['no_poke']."', '".$poke_entrer['nom']."', '".$niveau."', '".$sexe2."', '".$Chromatique."', '".$map."')");
    							$nbr_poke++; 
    						}
    				
    		}
    			header('location:test_affiche.php');
    1. Contributeur
      il serait plus clair d'inverser le test des lignes 3 à 5, pour éviter le else.
      l'instruction fetch peut sortir du if.
      l'instruction query peux aussi sortir du if, il suffit de mémoriser le taux.