Почему этот код SQL выдает ошибку 1066 (не уникальная таблица / псевдоним: 'user')? - PullRequest
16 голосов
/ 17 сентября 2009

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

alt text

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

# 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'

Ответы [ 4 ]

34 голосов
/ 17 сентября 2009

Вам нужно присвоить пользовательской таблице псевдоним при втором подключении к ней

, например

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'
7 голосов
/ 17 сентября 2009

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

     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
6 голосов
/ 17 сентября 2009

Вы дважды упомянули «пользователя» в предложении 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 не догадается.)

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

0 голосов
/ 23 апреля 2019
    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';

Надеюсь, что это поможет

...