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.