2014-04-02 76 views
2

我有两个表格,用户和参赛者。我试图选择具有配置图片(这是对用户表)SQL使用MAX()加入。

我的继承人可怕SQL最大的选手ID:

SELECT u.thumbnail, u.id FROM users AS u 
INNER JOIN 
(
SELECT c.id, c.user_id FROM contestants AS c 
WHERE u.id = c.users_id 
AND c.id = (select max(c.id)) 
) WHERE u.thumbnail IS NOT NULL 

错误是目前:#1248 - 每一个派生表必须有自己的别名。

这让我困惑,因为用户有U型的别名,参赛者有C的别名..

我在做什么错在这里?我猜很多,所以一些帮助将非常感激!

+5

确切! ***“#1248 - 每个派生表都必须有自己的别名”***“。给第二个表(内部连接一个)提供一个别名,就像你先做的一样! –

回答

3

当你执行的是连接操作时,实际上是将两个表。例如,你在这里写的子查询是作为一个单独的表格工作的。因此,您必须为此表使用别名。这就是你的错误信息背后的原因。

您的疑问:

SELECT u.thumbnail, u.id FROM users AS u 
    INNER JOIN 
    (
    SELECT c.id, c.user_id FROM contestants AS c 
    WHERE u.id = c.users_id 
    AND c.id = (select max(c.id)) 
    ) WHERE u.thumbnail IS NOT NULL 

它应该包含一个别名为子查询:

SELECT c.id, c.user_id FROM contestants AS c 
    WHERE u.id = c.users_id 
    AND c.id = (select max(c.id)) 

比方说,这是T.

所以,你的查询现在变成:

SELECT u.thumbnail, u.id FROM users AS u 
    INNER JOIN 
    (
    SELECT c.id, c.user_id FROM contestants AS c 
    WHERE u.id = c.users_id 
    AND c.id = (select max(c.id)) 
    ) AS T 
    WHERE u.thumbnail IS NOT NULL 

但是什么你想实现的,其实也可以在一个更合适的方法来实现:

SELECT u.thumbnail, u.id, max(c.id), 
    FROM users as u 
    LEFT JOIN contestants as c 
    on u.id = c.user_id 
    WHERE u.thumbnail IS NOT NULL 

为什么要小题大做,当您在您的处置一个更好,更简洁的方法吗?

+0

非常感谢你!我希望我能给你更多的选票,因为我的问题已经解决了,并且你已经向我解释了子查询,我开始时非常模糊!真棒回答!:D – Sean

+0

你@Sean,我很高兴看到我的回答帮助你,就这些。:)关于子查询,基本上我也是一个初学者,而我最近才开始学习子查询。这就是为什么我能够识别你的问题,因为我已经学会了新鲜事物。学习是一个持续的过程。继续学习,继续解决问题,最终你会找到一个更好的位置。 –

2

试试这个:

SELECT u.thumbnail, u.id 
FROM users AS u 
INNER JOIN 
(
SELECT c.id, c.user_id FROM contestants AS c 
WHERE u.id = c.users_id 
AND c.id = (select max(c.id)) 
)A 
WHERE u.thumbnail IS NOT NULL 
+0

@Sean,看看我的答案.. – jmail

+0

#1054 - 'where子句'中的未知列'u.id' 感谢您的快速响应,A后的究竟是什么? – Sean

+0

事实上,我有更多的参赛者比用户会搞砸了吗?我应该首先从参赛者中选择,然后加入用户还是重要? o.O – Sean

0

我想这应该是简单的,

SELECT u.thumbnail, u.id 
FROM users u 
     INNER JOIN contestants c 
      ON u.id = c.users_id 
WHERE u.thumbnail IS NOT NULL 
ORDER BY c.id DESC 
LIMIT 1 
0

这是非常简单的。

SELECT user.thumbnail, user.id 
FROM users user 
     INNER JOIN contestants cont ON cont.id = cont.users_id 
WHERE cont.thumbnail IS NOT NULL 
ORDER BY user.id DESC