Page 1 sur 1

Optimiser une requête

Posté : 05 déc. 2007, 15:27
par p_m_g
Bonjour,

j'ai 2 tables :

Code : Tout sélectionner

CREATE TABLE `departements` ( `id_dept` tinyint(3) NOT NULL auto_increment, `id_reg` tinyint(2) NOT NULL default '0', `nom_dept` varchar(30) NOT NULL default '', UNIQUE KEY `id_dept_2` (`id_dept`), KEY `id_reg` (`id_reg`) ) TYPE=MyISAM; CREATE TABLE `regions` ( `id_reg` tinyint(2) NOT NULL auto_increment, `nom_reg` varchar(30) NOT NULL default '', `depts` varchar(30) NOT NULL default '', UNIQUE KEY `id_reg` (`id_reg`), KEY `id_reg_2` (`id_reg`) ) TYPE=MyISAM;
je souhaite affiche chaque regions avec ses departements.
avec la requete suivante ça me retourne chaque région mais avec seulement le 1er departement.

Code : Tout sélectionner

SELECT rgn.nom_reg, dpt.nom_dept, dpt.num_dept FROM regions AS rgn INNER JOIN departements AS dpt ON rgn.id_reg = dpt.id_reg
comment récupérer tous les départements ?

Merci

Posté : 05 déc. 2007, 16:31
par AB

Code : Tout sélectionner

$req = "SELECT reg.nom_reg, dep.nom_dept FROM regions as reg JOIN departements as dep ON reg.id_reg = dep.id_reg";
Chez moi ça marche, mais évidemment en une seule requête tu va avoir les champs de région répétés.
Il faudra donc faire un post traitement php pour éviter de réafficher les régions pour chaque département.

Sinon tu peux aussi faire deux requêtes

Posté : 05 déc. 2007, 16:40
par p_m_g
effectivement ça marche, j'avais oublié d'enlever group by.

en fait, le group by avait une incidence puisque je récupère bien tous les departements mais avec à chaque fois le nom de la région.
il faut en fait que je gère l'affichage des regions.

est-il possible dans la réquete de récupèrer une seule fois la region ?

Posté : 05 déc. 2007, 16:51
par AB
En une seule requête je sais pas faire. Mais le traitement php pour éviter d'afficher plusieurs fois les régions est assez simple.
Le seul pb de ce type de requêtes c'est si tu veux limiter par un limit dans la requête, l'affichage du nombre de régions.

Posté : 05 déc. 2007, 17:13
par p_m_g
merci pour les infos, je vais traiter l'affichage en php.

Posté : 05 déc. 2007, 17:16
par AB
Le traitement php devrait ressembler à ça
$query = mysql_query($req) or die(mysql_error());

$temp = '';

while ($row_query =  mysql_fetch_assoc($query)) {

if ($row_query['nom_reg'] != $temp) echo '<strong>'.$row_query['nom_reg'].'</strong><br />';

echo $row_query['nom_dept'].'<br />';

$temp = $row_query['nom_reg'];
		}

Posté : 05 déc. 2007, 17:25
par p_m_g
c'est exactement ce que j'ai fais pour le traitement de la region.

autre question pendant que nous y sommes, j'utilise toujours mysql_fetch_object et là je vois que tu utilses mysql_fetch_assoc.

qu'est ce qui est mieux pour l'optimisation ?

Posté : 05 déc. 2007, 18:03
par AB
Manuel php a écrit
Note: Performance Concernant la vitesse, mysql_fetch_object() est aussi rapide que mysql_fetch_array() et presque aussi rapide que mysql_fetch_row() (la différence est insignifiante).

Note: mysql_fetch_object() est identique à mysql_fetch_array(), à la différence qu'elle retourne un objet à la place d'un tableau. Vous pourrez ainsi accéder aux valeurs des champs par leur nom, mais plus par leur offset (les nombres ne sont pas des noms MySQL).

Note: Performance Une chose importante à noter est que l'utilisation de mysql_fetch_assoc() n'est pas significativement plus lent que l'utilisation de mysql_fetch_row(), alors qu'il fournit des valeurs significatives ajoutées.
Il semblerait donc que la différence soit insignifiante

Posté : 05 déc. 2007, 18:05
par p_m_g
très bien le post est clos.