Re: [LA-discussions] mysql |
[ Thread Index | Date Index | More linuxarverne.org/discussions Archives ]
Matthieu wrote:
Salut, Merci KewlCat, un peu rappel ne fais pas de mal J'en profite pour me glisser dans la discussion. Tu utilise la clause WHERE pour joindre les 2 tables comme ceci : SELECT u.pseudo, c.nom, c.prenom, c.mail, c.etc FROM jos_users u, jos_comprofiler c WHERE u.id <http://u.id> = c.id <http://c.id>; Euh... J'ai toujours utilisé ceci : SELECT u.pseudo, c.nom, c.prenom, c.mail, c.etc FROM jos_users AS u LEFT JOIN jos_comprofiler AS c ON c.id <http://c.id> = u.id <http://u..id>;Quel est la différence ? Y'a t-il une méthode plus rapide ou meilleurs que l'autre ?-- Matthieu
Bonsoir !La différence c'est que la jointure utilisant la clause WHERE est restrictive ("INNER JOIN") alors que les LEFT JOIN (et RIGHT JOIN) sont des jointures plus permissives ("OUTER JOIN"), dans le sens où si l'un des enregistrements de la table de gauche (respectivement, de droite) ne contient pas d'éléments répondant à la condition donnée, tu le retrouveras quand même dans tes résultats mais avec des éléments null partout où tu t'attendais à avoir les valeurs des colonnes de la table de gauche (resp. droite). Dans le cas de cette recherche par id je me suis dit qu'il n'était pas indispensable de gérer le cas où tu aurais un pseudo dans la table jos_users mais pas d'infos complémentaires dans jos_compchaipukoi :-p
Exemple :Imaginons deux tables, l'une avec les id { 1, 2, 3, 10, 20, 30 } et l'autre avec les id { 1, 2, 3, 100, 200, 300 } et une requête qui fait une jointure de ces deux tables sur les id : - la requête en INNER JOIN (clause WHERE) renverra les éléments d'id 1, 2 et 3 - la requête en LEFT OUTER JOIN renverra les éléments d'id 1, 2, 3 (avec toutes les valeurs des deux tables) et 10, 20, 30 avec que des null pour les colonnes de la seconde table - la requête en RIGHT OUTER JOIN renverra les éléments d'id 1, 2, 3 (avec toutes les valeurs des deux tables) et 100, 200, 300 avec que des null pour les colonnes de la première table
En MySQL le mot-clé "OUTER" est facultatif.Au niveau de la rapidité d'exécution, ça doit se valoir puisque les conditions sont de toute façon évaluées pour chaque enregistrement. Après, si les volumes de données à retourner sont énormes il se peut que tu te retrouves avec plein d'enregistrements qui n'auront pas rempli la condition mais qu'il faudra transmettre quand même, mais tu n'es pas censé faire une jointure gauche / droite si tu ne les veux pas ;-) Et je crois que je viens de répondre à "y en a-t-il une meilleure que l'autre ?". Chacune fait une chose différente, donc en fonction de ce que tu veux obtenir il y en a une "meilleure", mais pas globalement une meilleure que les autres.
A propos des alias, pas d'inquiétude : la requête est considérée dans sa globalité (en plusieurs passes) avant d'être exécutée donc on peut tout à fait mettre dans le SELECT des noms de colonnes en utilisant les alias qui ne sont définis "qu'après" dans la clause FROM. Pas de souci de ce côté-là.
=^.^= --- Liste de discussions de LinuxArverne http://wiki.linuxarverne.org/listes_de_diffusion
Mail converted by MHonArc 2.6.19+ | http://listengine.tuxfamily.org/ |