2009-09-16 11 views
12

Esta es mi estructura de la tabla:¿Por qué este código SQL proporciona el error 1066 (No es la única tabla/alias: 'usuario')?

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

El mensaje de error es:

# 1066 - No es única mesa/alias: 'usuario'

La siguiente es mi código.

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' 

Respuesta

28

que necesita para dar la tabla de usuario un alias la segunda vez que se une a ella

por ejemplo,

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

Y, tal vez mejor: '... LEFT JOIN usuario como autor EN articulo.autor_id = LEFT JOIN author.id usuario como modificador EN article.modified_by = modifier.id'. Aliasing ambas referencias a 'user', en otras palabras, y dándoles nombres significativos (aunque también uso' u1' y 'u2' en tales situaciones). –

+0

Gracias, es el trabajo – neobeacon

+1

Hombre este es el verdadero negocio en INNER JOIN !! – Warface

6

Ha mencionado "usuario" dos veces en su cláusula FROM. Debe proporcionar un alias de tabla para al menos una mención, de modo que cada mención de usuario. puede ser fijado a uno u otro caso: (. Es posible que tenga algo diferente - Supuse qué usuario es cuál, pero el motor de SQL no adivinará)

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' 

Además, tal vez solo necesitaba un "usuario". ¿Quién sabe?

5

Su error es porque tiene:

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

tiene dos instancias de la misma tabla, pero la base de datos no se puede determinar cuál es cuál. Para solucionar este problema, es necesario utilizar alias de tabla:

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

Es buen hábito para siempre alias de tablas, a menos que como escribir el nombre de la tabla completa todo el tiempo cuando usted no tiene este tipo de situaciones.

Los próximos temas a tratar serán:

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

1) No utilice nunca SELECT * - siempre explicar en detalle las columnas que desee, incluso si se trata de toda la tabla. Read this SO Question to understand why.

2) Obtendrá errores ambiguos en las columnas relacionadas con las columnas user.name porque, una vez más, la base de datos no puede decir de qué instancia de tabla extraer datos. El uso de alias de tabla corrige el problema:

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

Gracias, ¿por qué dices que nunca utilices SELECT * – neobeacon

+0

@neobeacon: consulta la pregunta reciente sobre él: http://stackoverflow.com/questions/1433971/select-from-table-or-select-id-field1-field2- field3-from-table-best-practic –

Cuestiones relacionadas