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

Не потрудитесь делать его сами, просто используйте datejs.

16
задан Glorfindel 23 April 2019 в 04:50
поделиться

3 ответа

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

, например,

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'
34
ответ дан 30 November 2019 в 15:47
поделиться

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

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

6
ответ дан 30 November 2019 в 15:47
поделиться

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

     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 * - всегда указывайте нужные столбцы, даже если это вся таблица. Прочтите этот вопрос SO, чтобы понять, почему .

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

SELECT article.* , section.title, category.title, u.name, u2.name
8
ответ дан 30 November 2019 в 15:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: