【问题标题】:SQL Join with MAX().使用 MAX() 进行 SQL 连接。
【发布时间】:2014-04-02 04:40:48
【问题描述】:

我有两张桌子,用户和参赛者。我正在尝试选择具有个人资料图片的最大参赛者 ID(在用户表上)

这是我糟糕的 SQL:

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..

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

【问题讨论】:

  • 没错! " #1248 - 每个派生表都必须有自己的别名"。像第一个表一样为第二个表(内连接表)指定别名!

标签: mysql sql inner-join


【解决方案1】:

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

您的查询:

    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

当您有更好、更整洁的方法可供使用时,为什么要大惊小怪?

【讨论】:

  • 非常感谢!我希望我能给你更多的投票,因为我的问题已经解决了,而且你已经向我解释了子查询,我一开始就很模糊!真棒答案! :D
  • 你太好了@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

【讨论】:

  • #1054 - 'where 子句'中的未知列'u.id' 感谢您的快速响应,) 之后的 A 到底是什么?
  • 我的参赛者比用户多这一事实会不会把事情搞砸?我应该先从参赛者中选择,然后加入用户,还是有关系? o.O
  • 问题是你不应该在这里提到u.id是你的名字WHERE u.id = c.users_id。而A 仅表示alias 名称..
  • 好的,那我怎么引用它们呢?我已经尝试过 WHERE users.id = c.users_id、WHERE id = c.users_id 甚至 WHERE A.id = c.users_id 的笑声和几乎相同的错误。 ;(
【解决方案3】:

我认为这应该很简单,

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

【讨论】:

    【解决方案4】:

    这很简单。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多