2009-09-16 9 views
12

To moja struktura tabeli:Dlaczego ten kod SQL podaje błąd 1066 (Niepowtarzalna tabela/alias: "użytkownik")?

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

Komunikat o błędzie jest:

# 1066 - Nie wyjątkowy stół/alias: 'user'

Poniżej jest mój kod.

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' 

Odpowiedz

28

Trzeba dać tabeli użytkownika alias po raz drugi pan dołączyć do niego

np

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

A może lepiej: '... LEFT JOIN użytkownika jako autora NA article.author_id = author.id LEFT JOIN użytkownika jako modyfikator NA article.modified_by = modifier.id'. Aliasując oba odniesienia do 'user', innymi słowy, i nadając im znaczące nazwy (chociaż w takich sytuacjach używam również" u1 "i" u2 "). –

+0

Dzięki, to działa – neobeacon

+1

Man to jest prawdziwa okazja w INNER DOŁĄCZ !! – Warface

6

Dwa razy wspomniałeś "użytkownika" w klauzuli FROM. Musisz podać alias tabeli do co najmniej jednej wzmianki, aby każda wzmianka o użytkowniku. może być przypięty do jednej lub drugiej instancji: (. Może trzeba coś innego - Domyślałem których użytkownik jest który, ale silnik SQL nie odgadnie)

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' 

Również, może tylko potrzebował jednego "użytkownika". Kto wie?

5

Twój błąd jest, bo trzeba:

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

Masz dwie instancje tej samej tabeli, ale baza danych nie można określić, co jest czym. Aby rozwiązać ten problem, należy użyć aliasów tabel:

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

To dobry zwyczaj, aby zawsze alias tabel, chyba że lubisz pisać pełnej nazwy tabeli przez cały czas, gdy nie masz takich sytuacjach.

Kolejne problemy na adres będą:

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

1) Nigdy nie używać SELECT * - zawsze przeliterować kolumny, które chcesz, nawet jeśli jest cała tabela. Read this SO Question to understand why.

2) Otrzymasz niejednoznaczne błędy kolumn odnoszące się do kolumn user.name, ponieważ ponownie baza danych nie może stwierdzić, z której instancji tabeli pobierane są dane. Korzystanie z aliasów tabel rozwiązuje problem:

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

Dzięki, dlaczego mówisz Nigdy nie używaj SELECT * – neobeacon

+0

@neobeacon: Zobacz ostatnie pytanie na ten temat: http://stackoverflow.com/questions/1433971/select-fable-table-or-select-id-field1-field2- field3-from-table-best-practic –

Powiązane problemy