2017-05-24 173 views
1

我已经看过S.O的可能解决方案,我的查询仍然无法正常工作。MySQL JOIN错误:每个派生表都必须有自己的别名

这里的查询:

SELECT `messages`.`from_id`, 
    `messages`.`to_id`, 
    `messages`.`message` 
FROM `messages` 
JOIN 
(
    SELECT `users`.`profile_pic` 
    FROM `users` AS `from_pic` 
    WHERE `users`.`id` = `from_id` 
) 
    ON `users`.`id` = `messages`.`from_id` 
JOIN 
(
    SELECT `users`.`profile_pic` 
    FROM `users` AS `to_pic` 
    WHERE `users`.`id` = `to_id` 
) 
    ON `users`.`id` = `messages`.`to_id` 
WHERE `messages`.`from_id` = 23 
    AND `messages`.`to_id` = 24 
ORDER BY `date_sent` DESC; 

users

id | profile_pic | name 

messages

message_id | from_id | to_id | message 

回答

1

当您使用子查询,则需要对他们提供一个别名:

SELECT 
    `messages`.`from_id`, 
    `messages`.`to_id`, 
    `messages`.`message` 
FROM `messages` 
JOIN 
(
    SELECT 
    `from_pic`.`id`, 
    `from_pic`.`profile_pic` 
    FROM `users` AS `from_pic` 
) u1 --- alias 
    ON u1.`id` = `messages`.`from_id` 
JOIN 
(
    SELECT 
    `to_pic`.`id`, 
    `to_pic`.`profile_pic` 
    FROM `users` AS `to_pic` 
) u2 ---- alias 
    ON u2.`id` = `messages`.`to_id` 
WHERE `messages`.`from_id` = 23 
    AND `messages`.`to_id` = 24 
ORDER BY `date_sent` DESC; 

这也没有子查询写成:

SELECT 
    `messages`.`from_id`, 
    `messages`.`to_id`, 
    `messages`.`message` 
FROM `messages` 
JOIN `users` AS `from_pic` 
    ON `from_pic` = `messages`.`from_id` 
JOIN `users` AS `to_pic` 
    ON `to_pic`.`id` = `messages`.`to_id` 
WHERE `messages`.`from_id` = 23 
    AND `messages`.`to_id` = 24 
ORDER BY `date_sent` DESC; 
+0

我明白了。我之前试过这个,但是我得到这个错误,所以我不知道什么是错的:'#1054 - 未知列'users.profile_pic'in'字段列表' ' – nTuply

+0

@nTuply看到我的编辑,你已经在'users'表的子查询中提供了别名,您需要在那里引用该别名。 – ollie

+0

'#1054 - 'where子句'中的未知列'from_id'错误很疯狂。你认为我应该发布我的餐桌设计吗? – nTuply

-1

您需要将您的from_pickto_pic别名出来,他们不需要在子查询和使用他们因此在你的加入条件,就像这样:

SELECT `messages`.`from_id`, 
    `messages`.`to_id`, 
    `messages`.`message` 
FROM `messages` 
JOIN 
(
    SELECT `users`.`profile_pic` 
    FROM `users` 
    WHERE `users`.`id` = `from_id` 
) AS `from_pic` 
    ON `from_pic`.`id` = `messages`.`from_id` 
JOIN 
(
    SELECT `users`.`profile_pic` 
    FROM `users` 
    WHERE `users`.`id` = `to_id` 
) AS `to_pic` 
    ON `to_pic`.`id` = `messages`.`to_id` 
WHERE `messages`.`from_id` = 23 
    AND `messages`.`to_id` = 24 
ORDER BY `date_sent` DESC; 

更重要的是,你甚至不真正需要的子查询:

SELECT `messages`.`from_id`, 
    `messages`.`to_id`, 
    `messages`.`message` 
FROM `messages` 
JOIN `users` AS `from_pic` ON `from_pic`.`id` = `messages`.`from_id` 
JOIN `users` AS `to_pic` ON `to_pic`.`id` = `messages`.`from_id` 
WHERE `messages`.`from_id` = 23 
    AND `messages`.`to_id` = 24 
ORDER BY `date_sent` DESC; 
+0

哎。如果你打算投票,你至少应该说出答案的问题。 – Uueerdo

相关问题