2009-09-16 5 views
12

Questa è la mia struttura della tabella:Perché questo codice SQL restituisce l'errore 1066 (tabella/alias non unica: 'utente')?

alt text http://img6.imageshack.us/img6/8730/articlek.jpg

Il messaggio di errore è:

# 1066 - Non unico tavolo/alias: 'utente'

Quello che segue è il mio codice.

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' 

risposta

28

È necessario dare la tabella utente un alias la seconda volta che si uniscono ad esso

esempio

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' 
+2

E, forse meglio: '... LEFT JOIN utente come autore ON article.author_id = author.id LEFT JOIN utente come modificatore ON article.modified_by = modifier.id'. Aliasing entrambi i riferimenti a 'utente', in altre parole, e dando loro nomi significativi (anche se io uso anche' u1' e 'u2' in tali situazioni). –

+0

Grazie, è lavoro – neobeacon

+1

Man questo è il vero affare INNER JOIN !! – Warface

6

Hai menzionato "utente" due volte nella clausola FROM. È necessario fornire un alias di tabella ad almeno una menzione, quindi ogni menzione dell'utente. può essere appuntato ad una o l'altra istanza: (. Potrebbe essere necessario qualcosa di diverso - ho indovinato quale utente è che, ma il motore di SQL non indovinare)

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' 

Inoltre, forse solo aveva bisogno di un "utente". Chissà?

5

Il tuo errore è perché avete:

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

Hai due istanze dello stesso tavolo, ma il database non può determinare quale è quale. Per risolvere questo problema, è necessario utilizzare alias di tabella:

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

E 'buona abitudine per sempre alias le tabelle, a meno che non ti piace scrivere il nome completo tavola tutto il tempo in cui non si dispone di situazioni come queste.

I prossimi temi da affrontare saranno:

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

1) Non usare mai SELECT * - sempre precisare le colonne che si desidera, anche se è l'intera tabella. Read this SO Question to understand why.

2) Si otterranno errori di colonna ambigui relativi alle colonne user.name perché, di nuovo, il database non può stabilire da quale istanza di tabella estrarre i dati. Utilizzando gli alias di tabella di risolvere il problema:

SELECT article.* , section.title, category.title, u.name, u2.name 
+0

Grazie, perché dici di non usare mai SELECT * – neobeacon

+0

@neobeacon: vedere la domanda recente su di esso: http://stackoverflow.com/questions/1433971/select-from-table-or-select-id-field1-field2- field3-da-tavolo-best-practic –