Je viens de comprendre ce out. il est probablement une mauvaise pratique, mais cela a fonctionné pour moi dans ce cas.
Je suis l'un des gens paresseux qui ne veulent pas alias ou écrire chaque nom de colonne avec un préfixe de table.
Vous pouvez sélectionner toutes les colonnes d'une table spécifique en utilisant table_name.*
dans votre instruction select.
Lorsque vous avez des noms de colonne dupliqués, mysql écrase du premier au dernier. Les données du premier nom de colonne dupliqué seront remplacées quand il rencontrera à nouveau ce nom de colonne. Donc, le nom de la colonne en double qui vient en dernier gagne.
Si je joins 3 tables contenant chacune un nom de colonne dupliqué, l'ordre des tables dans l'instruction select déterminera quelles données je reçois pour la colonne dupliquée.
Exemple:
SELECT table1.* , table2.* , table3.* FROM table1 LEFT JOIN table2 ON table1.dup = table2.dup LEFT JOIN table3 ON table2.dup = table3.dup;
Dans l'exemple ci-dessus, la valeur de dup
je reçois sera de table3
.Et si je veux dup
être la valeur de table1
?
Alors je dois faire ceci:
SELECT table3.* , table2.* , table1.* FROM table1 LEFT JOIN table2 ON table1.dup = table2.dup LEFT JOIN table3 ON table2.dup = table3.dup;
Maintenant, table1
vient en dernier, donc la valeur de dup
sera la valeur de table1.
J'ai obtenu la valeur que je recherchais pour dup
sans avoir à écrire chaque colonne et je reçois toujours toutes les colonnes pour travailler. Yay!
Je sais que la valeur de dup
doit être la même dans les 3 tables, mais que se passe-t-il si table3
n'a pas de valeur correspondante pour dup
? Alors dup
serait vide dans le premier exemple, et ce serait un bummer.
Cette réponse a fait les réponses à http://stackoverflow.com/questions/9233387/sql-should-i-use-a-join travailler pour moi, merci! – AVProgrammer
Le principal inconvénient de cette approche est que contrairement à 'SELECT *', la requête est étroitement liée à la structure de la table. C'est-à-dire, chaque fois que vous ajoutez/supprimez/renommez des colonnes dans le schéma, vous devez modifier votre requête en conséquence. –
@RonInbar. 'SELECT *' est un cauchemar de maintenance dans les gros systèmes. Vous suggérez que l'ajout d'une colonne est simple et ne nécessite aucune modification de SQL si vous utilisez 'SELECT *', cependant ce n'est pas le cas comme dans le problème d'alias identifié ici. Il peut également donner un impact de performance inutile si le nouveau champ est grand. Il peut également casser les contrôles côté client qui attendent un certain nombre ou des champs. Je peux continuer, mais les avantages de 'SELECT *' disparaissent très rapidement lorsque vous comprenez l'impact que cela a sur la maintenabilité et la performance. –