Почему этот код SQL дает ошибку 1066 (Не уникальная таблица/псевдоним: "пользователь" )?

Это моя структура таблицы:

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

Сообщение об ошибке:

# 1066 - Не уникальная таблица/псевдоним: 'пользователь'

Ниже приведен мой код.

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'

Ответ 1

Вам нужно указать таблицу пользователя псевдоним во второй раз, когда вы присоединитесь к ней

например.

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

Вы дважды упоминали "пользователь" в своем предложении FROM. Вы должны предоставить псевдоним таблицы, по крайней мере, для одного упоминания, поэтому каждое упоминание пользователя. могут быть привязаны к одному или другому экземпляру:

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'

(Вам может понадобиться что-то другое - я догадался, какой пользователь есть, но механизм SQL не догадается.)

Кроме того, возможно, вам нужен только один "пользователь". Кто знает?

Ответ 3

Ваша ошибка в том, что у вас есть:

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

У вас есть два экземпляра одной таблицы, но база данных не может определить, какая из них. Чтобы исправить это, вам нужно использовать псевдонимы таблиц:

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

Хорошая привычка всегда ссылаться на ваши таблицы, если вам не нравится писать полное имя таблицы все время, когда у вас нет таких ситуаций.

Следующие вопросы для адреса будут следующими:

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

1) Никогда не используйте SELECT * - всегда указывайте нужные столбцы, даже если это вся таблица. Прочтите этот вопрос, чтобы понять, почему.

2) Вы получите неоднозначные ошибки столбца, относящиеся к столбцам user.name, потому что снова база данных не может определить, из какого экземпляра таблицы извлекаются данные. Использование псевдонимов таблицы устраняет проблему:

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