requete très complexe

Mammouth du PHP | 804 Messages

24 juil. 2011, 13:36

Bonjour,

Je souhaiterai faire un classement mais en limitant les requêtes et le codage, je n'aurai aucun problème à le mettre en place, mais le faire de façon optimisé et logique c'est une autre histoire, je suis certain qu'une seule requête MySQL bien conçue peut me faire ca, mais c'est un niveau que je n’ai pas, ca dépasse mes connaissances.

J’ai une BDD avec des circuits ou les pilotes automobile peuvent participer en fonction de leurs nombres de points, ils ont un minimum et un maximum de points à respecter pour participer à chacune de ces courses.
Id / circuit / points min / points max

puis une autre BDD ou ce trouve tous les pilotes
nom / points

est il possible de faire une requête MySQL qui arriverait à me classer chaque pilote dans la course qu'il peut courir ?

exemple:

circuit1 entre 0 et 10 points
_________________________
joueur1 point = 7
-----------------------
joueur4 points = 3

circuit2 entre 10 et 20 points
_________________________
joueur2 points = 12
-----------------------
joueur3 points = 18

Mille mercis par avance
dog

Mammouth du PHP | 804 Messages

24 juil. 2011, 17:04

ci dessous le code que j'ai fais qui fonctionne parfaitement mais qui ne me plait pas du tout :non:

		$query = "SELECT * FROM ***niveau*** WHERE 1 ORDER BY ***_niv DESC ";
		
		$result = mysql_query($query) or die(mysql_error());
		
		while($row = mysql_fetch_array($result)) {
				
		$query2 = "SELECT * FROM ***pilote***  WHERE plt_pts >= ".$row[***_min]." && plt_pts < ".$row[***_max]."  ";

		$result2 = mysql_query($query2) or die(mysql_error());
		
		$class = 0 ;
		
		echo "<table id=\"css_auto_pilote\" ><caption>".$row[***_nomCircuit]."</caption>
    	<thead>
        <tr>     
        <th class=\"sortable-bt\">Classement</th>        
        <th class=\"sortable-bt\">Points</th>        
        <th class=\"sortable-bt\">Pseudo PS3</th>        
        </tr>
        </thead>
        <tbody>";
		$class = 0;
		
		while($row = mysql_fetch_array($result2)) {

		$DB_plt_login = $row['plt_login'];
		$DB_plt_pts = $row['plt_pts'];

		
		$class++;
	
		echo"		
		<tr>
		<td class=\"lign\">$class</td>
		<td class=\"lign\">$DB_plt_pts</td>              
		<td class=\"lign\">$DB_plt_login</td>
		</tr>";
		
		 } 
		
		echo "</tbody></table>";

}


devlop78
Invité n'ayant pas de compte PHPfrance

25 juil. 2011, 01:24

SELECT pilotes.id FROM pilotes,courses WHERE pilotes.score BETWEEN courses.min AND courses.max ORDER BY ...

Enfin, une première idée car je n'ai pas tout saisis et que je réinstalle Windows (mais il n'y a aucun rapport).

Mammouth du PHP | 804 Messages

29 juil. 2011, 13:59

SELECT pilotes.id FROM pilotes,courses WHERE pilotes.score BETWEEN courses.min AND courses.max ORDER BY ...
salut,

c'est la même chose qu'un simple select sur la table pilote, il affichera la liste des pilotes mais ne me séparera pas par niveau

devlop78
Invité n'ayant pas de compte PHPfrance

29 juil. 2011, 14:00

Ta question n'est pas claire en fait

Mammouth du PHP | 568 Messages

29 juil. 2011, 14:12

Ta question n'est pas claire en fait
En fait mise à part fusionner tes deux requêtes, c'est surtout l'affichage qu'il faut revoir dans ce genre de cas de figure.

Mammouth du PHP | 804 Messages

29 juil. 2011, 14:19

En fait mise à part fusionner tes deux requêtes, c'est surtout l'affichage qu'il faut revoir dans ce genre de cas de figure.
c'est ce que je me demandais à l'instant :?
c'est coton mon problème :?

Eléphanteau du PHP | 39 Messages

30 juil. 2011, 10:48

Je crois avoir résolu ton problème. Je l'ai testé et ça fonctionne niquel. Tu as juste à modifier quelques trucs comme le nom de la DB, login/password, etc.

Bonne journée !
//Connexion à la base de donnée
    $PDO = new PDO ('mysql:host=localhost;dbname=aide_phpfrance','root','root');
    $PDO->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
    $PDO->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_OBJ);
    
    //Récuper la table "Pilotes" et le met dans la var $liste_pilote
    $req = $PDO->prepare('SELECT * FROM pilotes');
    $req->execute();
    $liste_pilote = $req->fetchAll();
    
    //Récuper la table "Circuits" et le met dans la var $liste_circuit
    $req = $PDO->prepare('SELECT * FROM circuits');
    $req->execute();
    $liste_circuit = $req->fetchAll();
    
    //Compte le nombre de valeur pour la boucle
    $count_circuit = count($liste_circuit);
    $count_pilote = count($liste_pilote);
    
    //À chaque tour, j'ajoute 1 pour parcourir le tableau en entier
    for($i_circuit = 0; $i_circuit < $count_circuit; $i_circuit++)
    {
        //J'affiche le nom des pistes avec les conditions
        echo $liste_circuit[$i_circuit]->circuit.' entre '.$liste_circuit[$i_circuit]->points_min.' et '.$liste_circuit[$i_circuit]->points_max.'<br/>';
        echo '_________________<br/>';
        
        for($i_pilote = 0; $i_pilote < $count_pilote; $i_pilote++)
        {
            //Je vérifie si les pilotes répondent aux conditions des circuits
            if
            (
                $liste_pilote[$i_pilote]->points >= $liste_circuit[$i_circuit]->points_min &&
                $liste_pilote[$i_pilote]->points <= $liste_circuit[$i_circuit]->points_max
             )
            {
                //J'affiche maintenant le nom des joueurs dans les bons circuits
                echo $liste_pilote[$i_pilote]->nom.' points = '.$liste_pilote[$i_pilote]->points.'<br/>';
                echo '-----------------------<br/>';
            }
        }
    }
“We spend money that we do not have, on things we do not need, to impress people who do not care.”
― Will Smith

Mammouth du PHP | 804 Messages

01 août 2011, 11:19

salut ,

je viens de tester ton code il ne fonctionne, peut etre que je ne suis pas équiper pour la PDO

merci de ton aide

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

01 août 2011, 12:36

salut ,

je viens de tester ton code il ne fonctionne, peut etre que je ne suis pas équiper pour la PDO

merci de ton aide
heu si tu a php 5 ça devrait aller, tu peux le voir dans un phpinfo();

y a t il un message d'erreur avec ça ?
si ce n'est pas le cas ajoute un error_reporting(-1); en 1ère ligne du script.

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 804 Messages

01 août 2011, 13:50

effectivement je suis en php5 et aucun rapport d'error avec error_reporting(-1); :?:

Mammouth du PHP | 804 Messages

01 août 2011, 13:59

Écoute, je viens de tester la PDO su rune petite requête banal ca marche impec, donc on peut ce concentrer sur ton code :D

Mammouth du PHP | 804 Messages

01 août 2011, 15:58

bon bein je viens d'en finir avec mon problème, j'ai pas utiliser la PDO mais je te remercie d'avoir essayer de m'aider

au cas ou quelqu'un à besoin de régler le même problème que moi je montre mon code commenté que je souhaitai obtenir
		$class = 0; // initialise ma variable classement (position des pilotes sur le classement général)	
		
		$query = "SELECT pilotes.* , circuits.circuit_id,circuits.circuit_niv,circuits.circuit_min,circuits.circuit_max 
		FROM pilotes 
		LEFT JOIN circuits ON pilotes.pilotes_pts BETWEEN circuits.circuit_min AND circuits.circuit_max 
		ORDER BY circuits.circuit_niv DESC";
	
		$result = mysql_query($query) or die(mysql_error());

		while($row = mysql_fetch_array($result)){
		
		
		$bdd_circuits_niv = $row['circuit_niv']; 
		//tableau associatif pour les titres de chaque niveau
		$bdd_circuits_min[$bdd_circuits_niv] = $row['circuit_min']; 
		$bdd_circuits_max[$bdd_circuits_niv] = $row['circuit_max'];
		
		//je crèe un tableay array avec tout les circuit liés à chaque pilote 
		//(logiquement on à plein de doublon vu qu'il y a plusieurs pilotes par circuit
		$nbresult[] = $row['circuit_niv'];
		
		//données des pilotes
		$DB_id = $row['id'];
		$bdd_piloteslogin = $row['pilotes_login'];
		$bdd_pilotespts = $row['pilotes_pts'];
		
		$class++;
		
		// je crée les ligne de chaque pilote avec en clé le nibveau du circuit
		$listPilotes[$bdd_circuits_niv].="		
		<tr>
		<td class=\"lign\">$class</td>
		<td class=\"lign\">$bdd_piloteslogin</td>
		<td class=\"lign\">$bdd_pilotespts</td>              
		</tr>";
		
		} 

		$sansdoublon = array_unique($nbresult); // je supprime les doublons de mon tableau circuit voir plus haut
		$nbdecircuitfinal = count($sansdoublon); // je recompte les circuits pour en supprimant les doublons
			
		$i = $nbdecircuitfinal; // initialisation de la variable de boucle 
		
		for( ; $i >= 1; )

		{				
				echo "<table id=\"css_auto_pilote\" ><caption>Niveau $i pour les pilotes ayant de $bdd_circuits_min[$i] à $bdd_circuits_max[$i] </caption>
				<thead>
				<tr>     
				<th class=\"sortable-bt\">Classement</th>        
				<th class=\"sortable-bt\">Pseudo PS3</th>        
				<th class=\"sortable-bt\">Points</th>        
				</tr>
				</thead>
				<tbody>";		
					
				echo $listPilotes[$i];
				
				echo "</tbody></table>";
				
				$i -= 1; 
				
			
		}

merci devlop78 pour BETWEEN je découvre :oops:

Eléphanteau du PHP | 39 Messages

02 août 2011, 00:27

Est-ce que tu ne prends pas mon code parce que tu n'arrives pas à le faire fonctionner ou tu as juste décider de faire ton propre code à la place ?
“We spend money that we do not have, on things we do not need, to impress people who do not care.”
― Will Smith

Mammouth du PHP | 804 Messages

02 août 2011, 12:34

salut,

parce que je n'arrive pas à le faire fonctionner, tu as par contre suciter ma curiosité et je pense que je vais me pencher sur la PDO :D , je ne savais pas que je pouvais l'utiliser :roll:

en tout cas merci pour le temps que tu as pris pour m'aider