J'ai 2 tables. tbl_names
et tbl_section
qui contient le champ id
. Comment faire pour sélectionner le champ id
, car j'obtiens toujours l'erreur suivante:
1052: Column 'id' in field list is ambiguous
Voici ma requête:
SELECT id, name, section
FROM tbl_names, tbl_section
WHERE tbl_names.id = tbl_section.id
Je pourrais simplement sélectionner tous les champs et éviter l'erreur. Mais ce serait une perte de performance. Que devrais-je faire?
SQL prend en charge la qualification d'une colonne en préfixant la référence avec le nom complet de la table:
SELECT tbl_names.id, tbl_section.id, name, section
FROM tbl_names
JOIN tbl_section ON tbl_section.id = tbl_names.id
... ou un alias de table:
SELECT n.id, s.id, n.name, s.section
FROM tbl_names n
JOIN tbl_section s ON s.id = n.id
L’alias de table est l’approche recommandée - pourquoi taper plus que nécessaire?
Deuxièmement, mes réponses utilisent la syntaxe ANSI-92 JOIN (la vôtre est ANSI-89). Même s'ils fonctionnent de la même manière, la syntaxe ANSI-89 ne prend pas en charge les jointures OUTER (DROITE, GAUCHE, FULL). La syntaxe ANSI-89 doit être considérée comme obsolète. Il y en a beaucoup sur SO qui ne votera pas pour la syntaxe ANSI-89 pour renforcer cela. Pour plus d'informations, voir cette question .
Dans votre instruction SELECT
, vous devez préfacer votre identifiant avec la table dans laquelle vous souhaitez le choisir.
SELECT tbl_names.id, name, section
FROM tbl_names
INNER JOIN tbl_section
ON tbl_names.id = tbl_section.id
OR
SELECT tbl_section.id, name, section
FROM tbl_names
INNER JOIN tbl_section
ON tbl_names.id = tbl_section.id
Vous feriez cela en fournissant un nom complet, par exemple:
SELECT tbl_names.id as id, name, section FROM tbl_names, tbl_section WHERE tbl_names.id = tbl_section.id
Ce qui vous donnerait l'id de tbl_names
Il y a déjà beaucoup de réponses à votre question, vous pouvez le faire aussi. Vous pouvez donner à votre table un nom d'alias et l'utiliser dans la requête select comme ceci:
SELECT a.id, b.id, name, section
FROM tbl_names as a
LEFT JOIN tbl_section as b ON a.id = b.id;
Ce que vous voulez probablement vraiment faire ici, c'est utiliser l'opérateur union comme ceci:
(select ID from Logo where AccountID = 1 and Rendered = 'True')
union
(select ID from Design where AccountID = 1 and Rendered = 'True')
order by ID limit 0, 51
Voici la documentation correspondante https://dev.mysql.com/doc/refman/5.0/fr/union.html
La solution la plus simple est une jointure avec USING
au lieu de ON
. De cette façon, la base de données "sait" que les deux colonnes id
sont en fait les mêmes, et ne va pas cocher:
SELECT id, name, section
FROM tbl_names
JOIN tbl_section USING (id)
Si id
est le seul nom de colonne commun à tbl_names
et tbl_section
, vous pouvez même utiliser un NATURAL JOIN
:
SELECT id, name, section
FROM tbl_names
NATURAL JOIN tbl_section
Voir aussi: https://dev.mysql.com/doc/refman/5.7/en/join.html
Si le format des identifiants dans les deux tables varie, vous souhaitez les joindre. Vous pouvez donc choisir d'utiliser un identifiant provenant d'une table principale, par exemple, si vous avez table_customes
et table_orders
, et L'identifiant pour les commandes ressemble à "101", "102" ... "11", utilisez-en simplement un pour les clients
select customers.id, name, amount, date from customers.orders;