Créer un classement groupé

VaN
Mammouth du PHP | 1107 Messages

20 juil. 2011, 11:30

Bonjour,

J'ai une table SQL de participations à un concours, de cette forme (en version simplifiée) :
CREATE TABLE IF NOT EXISTS `participations` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `note` float NOT NULL,
  PRIMARY KEY (`id`),
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=93 ;

INSERT INTO `participations` (`id`, `note`) VALUES
(1, 1),
(2, 4),
(3, 4),
(5, 4),
(86, 10),
(85, 5),
(84, 5),
(83, 4),
(82, 2),
(81, 9),
(80, 1),
(79, 4),
(78, 10),
(77, 8),
(76, 8),
(75, 3),
(74, 0),
(73, 3),
(72, 2),
(71, 0),
(70, 2),
(69, 1),
(68, 8),
(67, 9),
(66, 4),
(65, 4),
(64, 1),
(63, 9),
(62, 1),
(61, 9);
J'aimerai, en utilisant le moins de ressources possibles (ressources SQL, boucles PHP), me retrouver avec un tableau PHP faisant office de classement groupé, par note.

Dans ce tableau, les clés seraient les notes, ordonnées par ordre décroissant (donc de 10 à 0), et contiendrai chacune un tableau des ID correspondants.

Sur les premières lignes de la table SQL, cela donnerait :
Array(
    [10] => Array(
        [0] => 78,
        [1] => 86
    ),
    [9] => Array(
        [0] => 63,
        [1] => 67,
        [2] => 81
    ),
)
etc..

Comment faire cela sans surcharger le serveur de requêtes SQL et de boucles PHP inutiles ?

ViPHP
ViPHP | 5462 Messages

20 juil. 2011, 12:09


VaN
Mammouth du PHP | 1107 Messages

20 juil. 2011, 13:44

N'utilisant pas PDO, j'imagine que je vais devoir faire ça à base de boucles PHP, dommage.

ViPHP
ViPHP | 5462 Messages

20 juil. 2011, 14:30

N'utilisant pas PDO, j'imagine que je vais devoir faire ça à base de boucles PHP, dommage.
pourquoi tu n'utilises pas PDO ?

VaN
Mammouth du PHP | 1107 Messages

20 juil. 2011, 15:15

Je n'en n'ai pas encore vraiment compris l'utilité.
J'utilise un simple mysql_connect() pour la connection, et j'ai ma propre classe de récupération de données SQL.

ViPHP
ViPHP | 5462 Messages

20 juil. 2011, 15:20

Je n'en n'ai pas encore vraiment compris l'utilité.
j'ai ma propre classe de récupération de données SQL.
l'utilité c'est pour pas avoir à créer sa propre classe justement ...

Eléphant du PHP | 171 Messages

20 juil. 2011, 18:49

et j'ai ma propre classe de récupération de données SQL.
Et d'un point de vue fonctionnalités ta classe est elle aussi bien que PDO ?
Le bon jugement s'apprend par l'expérience qui s'acquiert en partie par le mauvais jugement.

VaN
Mammouth du PHP | 1107 Messages

22 juil. 2011, 15:43

et j'ai ma propre classe de récupération de données SQL.
Et d'un point de vue fonctionnalités ta classe est elle aussi bien que PDO ?
Aucune idée, elle ressemble à ça :
class Sql {
	
	public function __construct($bdd_host = BDD_HOST, $bdd_user = BDD_USER, $bdd_pass = BDD_PASS) {
		
	}
	
	public function connection($bdd_host, $bdd_user, $bdd_pass) {
		$connection = mysql_connect($bdd_host, $bdd_user, $bdd_pass);
		DEFINE('CONNECTION', $connection);
		
	}
	public function select_db($bdd_name = BDD_NAME) {
		mysql_select_db($bdd_name, CONNECTION);
	}
	
	##################################################################
	##																##
	## [F001]	SQL METHODS											##
	##																##
	##################################################################
	// Soumet une requete
	public static function sql_query($sql, $link_identifier = CONNECTION, $debug = false) {
		
		if($debug === true) echo "<p>".$sql."<p>";
		
		$query = mysql_query($sql, $link_identifier) or die(mysql_error());
		return $query;
	}

	// Retourne un tableau de données
	public static function get_array_from_query($sql, $link_identifier = CONNECTION, $debug = false) {
		
		if($debug === true) echo "<p>".$sql."<p>";
		
		$query = self::sql_query($sql, $link_identifier) or die(mysql_error());
		$data = array();
		while($result = mysql_fetch_assoc($query)) {
			$data[] = $result;
		}
		return $data;
	}

	// Retourne une liste d'objets
	public static function get_objects_from_query($sql, $class_name, $link_identifier = CONNECTION, $debug = false) {
		
		if($debug === true) echo "<p>".$sql."<p>";
		
		$query = self::sql_query($sql, $link_identifier) or die(mysql_error());
		$data = array();
		while($result = mysql_fetch_object($query, $class_name)) {
			$data[] = $result;
		}
		return $data;
	}

	// Retourne une ligne de donnees
	public static function get_row_from_query($sql, $link_identifier = CONNECTION, $debug = false) {
		
		if($debug === true) echo "<p>".$sql."<p>";
		
		$query = self::sql_query($sql, $link_identifier) or die(mysql_error());
		$data = array();
		while($result = mysql_fetch_assoc($query)) {
			$data[] = $result;
		}
		
		if(!empty($data[0])) {
			return $data[0];
		}
		else {
			return array();
		}
	}

	// Retourne une valeur unique
	public static function get_value_from_query($sql, $link_identifier = CONNECTION, $debug = false) {
		
		if($debug === true) echo "<p>".$sql."<p>";
		
		$query = self::sql_query($sql, $link_identifier) or die(mysql_error());
		$result = mysql_fetch_array($query);
		return $result[0];
	}

	// Retourne un tableau d'une ligne
	public static function get_field_array_from_query($sql, $link_identifier = CONNECTION, $debug = false) {
		
		if($debug === true) echo "<p>".$sql."<p>";
		
		$query = self::sql_query($sql, $link_identifier) or die(mysql_error());
		
		$results = array();
		
		while($result = mysql_fetch_array($query)) {
		
			if(!empty($result)) {
				$results[] = $result[0];
			}
			
		}

		return $results;
	}
	
}

ViPHP
ViPHP | 5462 Messages

26 juil. 2011, 11:01

oui donc la meme chose, par contre pour debuggue du mysql c'est pas avec des or die, mais en activant le trace mode
ini_set('mysql.trace_mode', true);
ou alors dans ta classe lancer une ErrorException