2011-08-11 83 views
1

這裏是我的查詢:問題的SQL查詢[內連接和多種選擇]

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 - 重複列名‘身份證’。」

表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 

我做錯了嗎?

感謝名單!

回答

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 
+0

這是正確的,但我錯誤:#1054 - '訂單子句'中的未知列'messages.id'。我認爲這是因爲這ORDER BY messages.id ASC – Mirgorod

+0

嗯...如何解決它? – Mirgorod

+0

我編輯過thge推薦 –

0

您的內部查詢顯示爲SELECT messages.*, users.*...,並且afo_messageskey_users都有一個id字段。選一個,或別名。

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 
+0

#1054 - 未知列「以條款」 – Mirgorod

+1

你不能做絲毫的故障排除,以確定問題可能是有什麼messages.id「? –

0

您有兩個id列,每個表中有一列。您不需要使用SELECT *和至少一個別名來給它一個獨特的名稱。

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

它與錯誤消息不匹配,但不應該最終的ORDER BY由ilv.id?

在外部查詢的上下文中,沒有引用過名爲「message」的表。