Quand une des condition est dans le résultat [SQL] - SQL/NoSQL - Programmation
Marsh Posté le 03-03-2014 à 05:57:47
Bonjour,
il vous manque une condition "a.id = b.id_pseudo" dans la clause where, pour justement matérialiser la jointure entre les deux tables.
Bonne continuation !
Marsh Posté le 04-03-2014 à 09:30:24
SELECT * FROM membre m INNER JOIN look l on (m.id_look = l.id)
WHERE m.actif = 1 AND l.id_cheveux = 2
Marsh Posté le 05-03-2014 à 10:05:16
Je vois pas l'intérêt de faire des alias sur une requête aussi simple Nevin0u.En plus, on le dira jamais assez, le "Select *" est mal mal mal et surtout complètement inutile là. Personnellement je trouve beaucoup plus clair :
Code :
|
Remarque à l'auteur de ce sujet : Si tu veux une personnes possédant DES cheveux ça sera "look.id_cheveux > 1"
Marsh Posté le 05-03-2014 à 16:24:39
Petitpois2 : c'est pour l'exemple que NevinOu a du mettre l'alias et le * c'est pour répondre rapidement...
Qu'est ce que cela fait de mettre un alias ou pas? à part d'avoir un code plus clair?
Est ce que tu as des temps de réponse meilleur sans ? si oui de combien?
Moi, je ne vois pas l'interet de répondre à ce genre de post, car c'est abusé de la gentillesse des gens...
Le bon coté, c'est que j'aurai peut être un idée du gain de performance en utilisant un alias ou pas
Guillaume
Marsh Posté le 05-03-2014 à 19:08:44
Salut
Je suppose que ca depend du SGBD, mais en theorie l'utilisation d'un alias peut faire une legere difference sur la compilation de la requete, mais pas sur l'execution.
Le cas ou les alias sont "mieux" c'est a la place d'un champ non qualifie (donc sans alias ni nom de table): sans alias, le moteur doit determiner lui-meme quelle table contient le champ, alors qu'avec un alias, c'est explicite.
Mais encore une fois, c'est seulement dans l'etape de compilation, et en theorie le moteur va sortir exactement le meme plan pour la meme requete avec ou sans alias, donc aucun impact sur l'execution; bref c'est souvent vraiment peanuts au final.
Dans le cas au-dessus, j'en sais rien: alias vs le nom de table directement, ca doit vraiment pas changer grand-chose.
Maintenant je n'adhere pas au commentaire de Petitpois2: personnellement, meme pour une petite requete comme celle-la, je la lis plus vite avec les alias (tant qu'ils restent simples: membre m, look l). De plus les alias c'est une des "best practice" les plus utiles en SQL je trouve. Du coup je comprends pas trop l'idee de ne pas les generaliser a de petites requetes.
Sinon tant qu'on en est dans la sodomie de mouches, pourquoi conseiller d'utiliser INNER JOIN au lieu de seulement JOIN? Ca surcharge la requete sans donner d'information supplementaire.
Marsh Posté le 05-03-2014 à 19:25:20
lasnoufle a écrit : Salut Sinon tant qu'on en est dans la sodomie de mouches, pourquoi conseiller d'utiliser INNER JOIN au lieu de seulement JOIN? Ca surcharge la requete sans donner d'information supplementaire. |
Parce que certaines BDD n'acceptent pas un JOIN sans un INNER (LEFT, RIGHT, OUTER, CROSS) devant...
Et une requête plus précise, qui va rien changer quand a l’exécution ça semble nettement mieux à mes yeux.
A+,
Marsh Posté le 05-03-2014 à 21:39:39
Je suis d'accord avec lasnoufle...
je mets des alias pour:
lire plus facilement mes requêtes,
par fainéantise et rapidité, car les noms de "mes tables" sont pas aussi simple à écrire... et ainsi gagner de la place, quand tu as des requêtes de la mort, cela vient vite gros...
de trouver l'appartenance à la table, quand on ne reprend une requête et que l'on connait pas tout la BD par cœur ...
mais c'est vrai que c'est plus des habitudes, qu'autres choses....
Marsh Posté le 06-03-2014 à 09:47:50
Moi je suis d'accord avec gilou et le "*" c'est une mauvaise habitude qui joue sur la performance aussi.
Les alias c'est très bien mais ça embrouille aussi, j'ai vu des développeurs qui s'embrouillait dans leurs alias, du coup quand il n'y en pas besoin, je pense (et c'est mon avis personnel) qu'il vaut mieux éviter d'en mettre. Par contre pour les grosses requêtes c'est bien sûr nécessaire.
Marsh Posté le 03-03-2014 à 00:50:41
Salut,
Je débute dans les fonctions SQL avancées, jointures...
J'ai deux tables : membre et look.
Elles sont construites de la sorte (je simplifie) :
Table Membre
#id #pseudo #id_look #actif
5 - tomware - 15 - 1
Table look
#id #id_pseudo #cheveux
15 - 5 - 2
Je voudrais construire une requete de la sorte :
Sors moi tous les membres actifs (1) qui ont des cheveux (2)
Voila ce que j'ai fait
$sql = 'SELECT * FROM membre a JOIN look b
WHERE a.actif = 1
AND b.id_cheveux = 2'
Cette requête me sort un faux résultat. Elle me liste tous les membres actifs (1) et leurs attribuent a tous des cheveux "2" alors que certains ont des valeurs différentes de 2.
Bref, la condition "avoir les cheveux 2" se trouve dans les résultats de "être actif 1" de la table membre. Sachant que ceux qui ont des cheveux (2) ne sont pas forcements actifs (1). Faut il bien faire une jointure ici ?
Que faire sinon ?
Merci
Message édité par tomware le 03-03-2014 à 01:19:31