从 MySQL 子查询返回 2 列?

Mil*_*lic 4 mysql join subquery

我是 MySQL 编程新手,但有一个问题。我创建了这个查询:

SELECT *,
       topics.createdate AS TopicCreateDate,
       (SELECT (SELECT username
                FROM   users
                WHERE  id = topicanswers.userid)
        FROM   topicanswers
        WHERE  topicid = topics.id
        ORDER  BY id DESC
        LIMIT  1)        AS LastPost
FROM   topics
       INNER JOIN categories
               ON topics.categoryid = categories.id
       INNER JOIN users
               ON topics.userid = users.id
ORDER  BY topics.lastupdate DESC
Run Code Online (Sandbox Code Playgroud)

此查询列出所有Topics、联接类别和用户,UserID以及类别 IDTopicsUsername来自TopicAnswersas LastPost。它命令它们LastUpdateTopics由 控制的范围内下降TRIGER

它工作得很好,但是这个子查询有一个问题:

            (SELECT (SELECT username
                    FROM   users
                    WHERE  id = topicanswers.userid)
            FROM   topicanswers
            WHERE  topicid = topics.id
            ORDER  BY id DESC
            LIMIT  1)        AS LastPost  
Run Code Online (Sandbox Code Playgroud)

它选择Username在主题最后发表的,从Users通过UserIDTopicAnswers作为LastPost,现在我想选择另一台一列UsersAvatarURL但我补充一下:

                        (SELECT username, avatarurl
                        FROM   users
                        WHERE  id = topicanswers.userid)
Run Code Online (Sandbox Code Playgroud)

它返回错误:

1241 操作数应包含 1 列

我怎样才能解决这个问题?

a_v*_*lad 7

这是绝对正确的错误,您在主选择中选择单列,因此它必须只返回一列以避免冲突

为每一列做一个新的子选择:

                (SELECT username
                FROM   users
                WHERE  id = topicanswers.userid) as username

                (SELECT avatarurl
                FROM   users
                WHERE  id = topicanswers.userid) as avatarur1
Run Code Online (Sandbox Code Playgroud)

同样将与 TOP 级别选择相关:

   (SELECT (SELECT username
            FROM   users
            WHERE  id = topicanswers.userid)
Run Code Online (Sandbox Code Playgroud)

如果在那里添加第二个查询 - 它会为 TOP Level SELECT 抛出错误

FROM   topicanswers
WHERE  topicid = topics.id
ORDER  BY id DESC
LIMIT  1)        AS LastPost
Run Code Online (Sandbox Code Playgroud)

你的查询应该是这样的:

SELECT *,
       topics.createdate AS TopicCreateDate,
       (SELECT (SELECT username
                FROM   users
                WHERE  id = topicanswers.userid)
        FROM   topicanswers
        WHERE  topicid = topics.id
        ORDER  BY id DESC
        LIMIT  1)        AS LastPost_name,

       (SELECT (SELECT avatarur1
                FROM   users
                WHERE  id = topicanswers.userid)
        FROM   topicanswers
        WHERE  topicid = topics.id
        ORDER  BY id DESC
        LIMIT  1)        AS LastPost_avatarur1

    FROM   topics
           INNER JOIN categories
                   ON topics.categoryid = categories.id
           INNER JOIN users
                   ON topics.userid = users.id
    ORDER  BY topics.lastupdate DESC
Run Code Online (Sandbox Code Playgroud)