J'ai deux tables liées entre elles :
TABLE 1 'elements' :
id (PK) ; type ; nom_original ; nom_occidental ; etc.
TABLE 2 'elements_liens'
id (PK) ; type_l ; id_lié (FK) ; nom (> c'est un "nom_occidental" de la table 1) ; id_el (> c'est l'id correspondant au "nom_occidental", je sais, ça fait doublon mais ça évite de refaire une toute petite requête, enfin, je crois)
La clef étrangère est la colonne id_lié et l'id_el renvoie à l'id de la table 1 puisque les éléments liés à chaque élément de la table 1 proviennent de cette table et on donc leur propres informations.
Bref, j'ai besoin d'afficher toutes ces infos et je me suis dit, forcément, tu vas faire une jointure puisque ça sert à ça, et que c'est bien les jointures, il paraît que ça prend moins de temps, ça envoie moins de requête, toussa. Et en avançant dans mon code, j'ai fini par utiliser les deux solutions, avec jointures ou avec deux requêtes séparées. Et tant qu'à faire, j'ai calculé le temps que donnent les deux codes pour me rendre compte après une moyenne de 100 essais que l'utilisation de la jointure met presque deux fois plus de temps qu'avec deux requêtes séparées. C'est aussi super chiant à mettre en place.
Donc, après vous avoir passé mes deux codes, je voudrais savoir ce qu'il en était : est-ce que c'est mon code qui est mauvais, qui peut être amélioré de manière significative (en sachant qu'il s'agit d'une version épurée pour les besoins de ce sujet, je ne compte pas l'utiliser tel quel mais chaque élément dispensé me servira à un moment où à un autre même si ça ne ressort que dans un echo), ou est-ce que c'est mon usage spécifique qui invalide l'intérêt d'une jointure ?
J'ai essayé de commenter au possible mon code.
Ha oui, je vous le contenu des deux tables pour $id=2;
TABLE 1 'elements'
id=2 ; type='gamm'; nom_original='fruit_eng' ; nom_occidental='fruit' ; etc.
TABLE 2 'elements_liens'
id=1 ; type_l='asc' ; id_lié=2 ; nom='chou' ; id_el=1 ;
id=2 ; type_l='des' ; id_lié=2 ; nom='carotte ' ; id_el=4 ;
id=3 ; type_l='des' ; id_lié=2 ; nom='patate' ; id_el=6 ;
id=4 ; type_l='des' ; id_lié=2 ; nom='tomate ' ; id_el=5 ;
//code piqué quelque part pour calculer l'exécution du script
//temps au début du script
$temps1 = microtime();
$temps1 = explode(' ', $temps1);
$debut1 = $temps1[1] + $temps1[0];
//PREMIER SCRIPT AVEC JOINTURE
if(isset($_GET['id']) AND $_GET['id']!='')
{
$id=filtre_d_recues($_GET['id']); //filtre_d_recues = fonction intval pour ce cas là
$v=mysqli_query($db,"SELECT * FROM elements_liens el_l RIGHT JOIN elements el ON el.id=el_l.id_lié WHERE el.id=".$id."");
$count_r=mysqli_num_rows($v);
echo 'NBR> '.$count_r.'<br/>';
$d=mysqli_fetch_assoc($v);
//simple dispensation de données de la table 1
echo $d['type'].'<br/>';
echo $d['nom_occidental'].'<br/>';
echo $d['nom_original'].'<br/>';
//les colonnes "type" et "type_l" ne renvoient que deux string : "asc" ou "des" qui me servent de filtre mais j'ai besoin de savoir dans un premier temps si la table "elements_liens" me donnent des résultats en fonction du "type_l" (asc ou des) avant de lancer des boucles pour afficher les "nom" et "id_el" qui vont avec.
$req_asc=mysqli_query($db,"SELECT COUNT(id) AS nbr_asc FROM elements_liens WHERE type_l='asc' AND id_lié=".$id."");
$req_des=mysqli_query($db,"SELECT COUNT(id) AS nbr_des FROM elements_liens WHERE type_l='des' AND id_lié=".$id."");
$fetch_asc=mysqli_fetch_assoc($req_asc);
$fetch_des=mysqli_fetch_assoc($req_des);
if($fetch_asc['nbr_asc']>0)
{
mysqli_data_seek($v,0);
while($d=mysqli_fetch_assoc($v)) if($d['type_l']=='asc') echo 'ASC> '.$d['nom'].' id> '.$d['id_el'].'<br/>';
}
if($fetch_des['nbr_des']>0)
{
mysqli_data_seek($v,0);
while($d=mysqli_fetch_assoc($v))if($d['type_l']=='des') echo 'DES> '.$d['nom'].' id> '.$d['id_el'].'<br/>';
}
}
//calcul du temps à la fin du script
$temps1 = microtime();
$temps1 = explode(' ', $temps1);
$fin1 = $temps1[1] + $temps1[0];
echo '_________________<br/>';
//nouveau calcul du temps au début du second script
$temps2 = microtime(); // Timestamp actuel avec microsecondes
$temps2 = explode(' ', $temps2); // Segmente le timestamp
$debut2 = $temps2[1] + $temps2[0];
//SECOND SCRIPT SANS JOINTURE
if(isset($_GET['id']) AND $_GET['id']!='')
{
$id2=filtre_d_recues($_GET['id']);
$req=mysqli_query($db,"SELECT * FROM elements WHERE id=".$id2."");
$count_r2=mysqli_num_rows($req);
echo 'NBR> '.$count_r2.'<br/>';
$d2=mysqli_fetch_assoc($req);
echo $d2['type'].'<br/>';
echo $d2['nom_occidental'].'<br/>';
echo $d2['nom_original'].'<br/>';
$req_asc2=mysqli_query($db,"SELECT * FROM elements_liens WHERE type_l='asc' AND id_lié=".$id2."");
$req_des2=mysqli_query($db,"SELECT * FROM elements_liens WHERE type_l='des' AND id_lié=".$id2."");
if(mysqli_num_rows($req_asc2)>0) while($d2=mysqli_fetch_assoc($req_asc2)) echo 'ASC> '.$d2['nom'].' id> '.$d2['id_el'].'<br/>';
if(mysqli_num_rows($req_des2)>0) while($d3=mysqli_fetch_assoc($req_des2)) echo 'DES> '.$d3['nom'].' id> '.$d3['id_el'].'<br/>';
}
//nouveau calcul du temps à la fin du second script
$temps2 = microtime();
$temps2 = explode(' ', $temps2);
$fin2 = $temps2[1] + $temps2[0];
$calcul1=round(($fin1 - $debut1),6);
$calcul2=round(($fin2 - $debut2),6);
echo '_________________<br/>';
echo "<span style='color:red;'>PREMIER SCRIPT (JOINture) script exécuté en ".$calcul1." secondes.</span><br/>";
$_SESSION['res1'][]=$calcul1;
$_SESSION['res2'][]=$calcul2;
echo "<span style='color:red;'>SECOND SCRIPT (SANS jointure) exécutée en ".$calcul2." secondes.</span><br/>";
echo 'Moyenne du 1er script> '.array_sum($_SESSION['res1'])/count($_SESSION['res1']).'<br/>';
echo 'Moyenne du 2nd script '.array_sum($_SESSION['res2'])/count($_SESSION['res2']).'<br/>';
echo count($_SESSION['res1']).'<br/>';
echo count($_SESSION['res2']);
exit;
Résultats du script :NBR> 4
gamm
fruit
fruit_eng
ASC> chou id> 1
DES> carotte id> 4
DES> patate id> 6
DES> tomate id> 5
_________________
NBR> 1
gamm
fruit
fruit_eng
ASC> chou id> 1
DES> carotte id> 4
DES> patate id> 6
DES> tomate id> 5
_________________
PREMIER SCRIPT (JOINture) script exécuté en 0.003178 secondes.
SECOND SCRIPT (SANS jointure) exécutée en 0.001295 secondes.
Moyenne du 1er script> 0.0025596
Moyenne du 2nd script> 0.00147112
100
100
Personnellement, je ne pense pas avoir fait un usage abusif de mes deux tables liées mais je compte sur vous pour me dire ce qu'il en est. En espérant avoir été assez clair.Merci d'avance.