Проблема с SQL-запросом [Внутреннее объединение и множественный выбор] - PullRequest
1 голос
/ 11 августа 2011

вот мой запрос:

SELECT * FROM 
   (SELECT messages.*, 
   users.* 
   FROM `afo_messages` as messages 
   INNER JOIN `key_users` as users ON messages.user_id = users.id 
   WHERE messages.category_id=5 
   ORDER BY messages.id DESC LIMIT 30) ilv 
ORDER BY messages.id ASC

Ошибка: «# 1060 - Дублирующееся имя столбца 'id'".

Столбцы afo_messages таблицы:

id | user_id | category_id | parent_id | message | create_date | update_date | status

Столбцы key_users таблицы:

id | name | email | phone | pwd | active | role | invite_id | download_link | date

Что я делаю не так?

Thanx!

Ответы [ 5 ]

4 голосов
/ 11 августа 2011

Уверен, что при выполнении внутреннего запроса результирующий набор имеет два столбца с именем ID (в сообщениях, один от пользователей); Затем вы выполняете запрос для этого подзапроса, и анализатор не понимает его.

Попытка:

SELECT * FROM 
(SELECT messages.id as message_id,
       messages.user_id, 
       ....all other columns from messages

       users.id as real_user_id, 
       users.name, 
       ..... all other columns from users
FROM `afo_messages` as messages 
INNER JOIN `key_users` as users ON messages.user_id = users.id 
WHERE messages.category_id=5 
ORDER BY messages.id DESC LIMIT 30) ilv 
ORDER BY message_id ASC
2 голосов
/ 11 августа 2011

Вы выбираете два столбца с именем ID без наложения одного. Тебе действительно нужны ВСЕ столбцы из обеих таблиц. Это вообще плохая практика. Возможно, вам лучше будет указать, какие именно столбцы вы хотите, и присвоить псевдониму один из ID s. Например:

SELECT * FROM 
   (SELECT messages.ID,  
    messages.message, 
    users.id as UserId, --aliasing this column to UserId
    users.name, 
    users.email
   FROM `afo_messages` as messages 
   INNER JOIN `key_users` as users ON messages.user_id = users.id 
   WHERE messages.category_id=5 
   ORDER BY messages.id DESC LIMIT 30) ilv 
ORDER BY messages.id ASC
0 голосов
/ 11 августа 2011

Оно не соответствует сообщению об ошибке, но не должно быть ваш окончательный ORDER BY от ilv.id?

В контексте вашего внешнего запроса ни одна таблица с именем "message" никогда не упоминалась.

0 голосов
/ 11 августа 2011

У вас есть два id столбца, по одному в каждой таблице. Вам не нужно использовать SELECT * и псевдоним хотя бы одного из них, чтобы дать ему другое имя.

SELECT * FROM (SELECT messages.id AS messageid, ...
0 голосов
/ 11 августа 2011

Ваш внутренний запрос говорит SELECT messages.*, users.*..., и оба afo_messages и key_users имеют поле id.Выберите один или псевдоним их.

...