SQL查询问题[内连接和多选]

时间:2011-08-11 15:39:26

标签: mysql sql syntax inner-join

这是我的查询:

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

我做错了什么?

感谢名单!

5 个答案:

答案 0 :(得分:4)

非常确定在运行内部查询时,结果集有两列名为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

答案 1 :(得分:2)

您正在选择两个名为ID的列,而不会出现别名。你真的需要两个表中的所有列。这通常是不好的做法。你可能最好准确地指定你想要的列和ID中的一个别名。例如:

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

答案 2 :(得分:0)

您的内部查询显示SELECT messages.*, users.*...afo_messageskey_users都有id字段。选择一个或别名。

答案 3 :(得分:0)

您有两个id列,每个表一个。您不需要使用SELECT *和至少其中一个别名来为其指定一个不同的名称。

SELECT * FROM (SELECT messages.id AS messageid, ...

答案 4 :(得分:0)

它与错误消息不匹配,但最终的ORDER BY不应该是ilv.id吗?

在外部查询的上下文中,没有引用名为“message”的表。