web-dev-qa-db-fra.com

Pourquoi ce code SQL donne-t-il l'erreur 1066 (table / alias non unique: «utilisateur»)?

Voici ma structure de table:

alt text

Le message d'erreur est:

# 1066 - Table/alias non unique: 'utilisateur'

Voici mon code.

SELECT article.* , section.title, category.title, user.name, user.name
FROM article
INNER JOIN section ON article.section_id = section.id
INNER JOIN category ON article.category_id = category.id
INNER JOIN user ON article.author_id = user.id
LEFT JOIN user ON article.modified_by = user.id
WHERE article.id = '1'
16
neobeacon

Vous devez donner un alias à la table utilisateur la deuxième fois que vous vous y joignez

par exemple.

SELECT article . * , section.title, category.title, user.name, u2.name 
FROM article 
INNER JOIN section ON article.section_id = section.id 
INNER JOIN category ON article.category_id = category.id 
INNER JOIN user ON article.author_id = user.id 
LEFT JOIN user u2 ON article.modified_by = u2.id 
WHERE article.id = '1'
34
codeulike

Votre erreur est due au fait que vous avez:

     JOIN user ON article.author_id = user.id
LEFT JOIN user ON article.modified_by = user.id

Vous avez deux instances de la même table, mais la base de données ne peut pas déterminer laquelle est laquelle. Pour résoudre ce problème, vous devez utiliser les alias de table :

     JOIN USER u ON article.author_id = u.id
LEFT JOIN USER u2 ON article.modified_by = u2.id

C'est une bonne habitude de toujours alias vos tables, sauf si vous aimez écrire le nom complet de la table tout le temps lorsque vous n'avez pas de situations comme celles-ci.

Les prochains problèmes à résoudre seront les suivants:

SELECT article.* , section.title, category.title, user.name, user.name

1) N'utilisez jamais SELECT * - épelez toujours les colonnes que vous voulez, même si c'est la table entière. Lisez ceci SO Question pour comprendre pourquoi .

2) Vous obtiendrez des erreurs de colonne ambiguës concernant le user.name colonnes car, encore une fois, la base de données ne peut pas dire à partir de quelle instance de table extraire les données. L'utilisation d'alias de table résout le problème:

SELECT article.* , section.title, category.title, u.name, u2.name
7
OMG Ponies

Vous avez mentionné deux fois "utilisateur" dans votre clause FROM. Vous devez fournir un alias de table à au moins une mention pour chaque mention d'utilisateur. peut être épinglé à l'une ou l'autre instance:

FROM article INNER JOIN section
ON article.section_id = section.id
INNER JOIN category ON article.category_id = category.id
INNER JOIN user **AS user1** ON article.author\_id = **user1**.id
LEFT JOIN user **AS user2** ON article.modified\_by = **user2**.id
WHERE article.id = '1'

(Vous pourriez avoir besoin de quelque chose de différent - j'ai deviné quel utilisateur est lequel, mais le moteur SQL ne le devinera pas.)

De plus, vous n'avez peut-être besoin que d'un "utilisateur". Qui sait?

6
Steve Kass
    SELECT art.* , sec.section.title, cat.title, use1.name, use2.name as modifiedby
FROM article art
INNER JOIN section sec ON art.section_id = sec.section.id
INNER JOIN category cat ON art.category_id = cat.id
INNER JOIN user use1 ON art.author_id = use1.id
LEFT JOIN user use2 ON art.modified_by = use2.id
WHERE art.id = '1';

J'espère que cela pourrait aider

0
Anindyo Bose