返回多于一列的 SQL 子查询

Posted

技术标签:

【中文标题】返回多于一列的 SQL 子查询【英文标题】:SQL subquery that returns more than one column 【发布时间】:2016-02-14 05:05:48 【问题描述】:

我正在尝试执行我认为是简单的 SQL 语句,但是当我尝试使用子查询时收到错误消息,说正在返回多个列,但我需要返回多个列.

我只是想显示两列,我的用户名和他们当前的余额

这里是 SQL:

SELECT playid, username, balance FROM plays order by playid desc limit 25

返回:

Play ID Username    Balance

593     ken     -3497

592     cass    -204

591     cass    -184

590     cass    -164

589     ken     -517

580     ken     -837

579     sam      250

545     cass    -134

544     cass    -114

这正是我想要的。我所有成员的列表,以及他们的余额。现在我需要在这个查询上运行一个 SUBQUERY,只选择 ID 最高的余额(最近的余额),这将返回一个这样的表:

Play ID Username    Balance

593     ken     -3497

592     cass    -204

579     sam      250

最近的余额是我唯一关心的事情。当我尝试执行第二个查询时,我收到一条错误消息,指出我正在尝试返回多个列。 (我当然是)

任何帮助将不胜感激。

【问题讨论】:

我认为你需要澄清你想要什么作为你的输出。您绘制的最后一张表格与您对所需内容的书面描述不一致。 你的第二个查询是什么 第二张表的输出正是我想要的。用户的 Play ID、用户名和余额。最新的余额将具有最高的 playID。每次为每个用户调整余额时,playID 都会增加,因此我不关心旧余额。我不确定我是否需要这个语句的子查询。理想情况下,我想使用某种用户名 DISTINCT 语句,但这不起作用。 Blip 表示查询,而不是结果。类似于SELECT ... FROM ... 这是我的问题。如何查询第一个表以执行 SELECT DISTINCT username 之类的操作,以删除错误的用户名,并且只使用一个用户名和一个余额,即具有最高 playID 的余额。 【参考方案1】:

编辑:您现在已经提到这是针对 mysql 的。试试这个:

SELECT
    p1.playid,
    p1.username,
    p1.balance
FROM
    plays p1
JOIN
    (
    SELECT
        MAX(playid) AS playid,
        username
    FROM
        plays
    GROUP BY
        username
    ) p2
    ON  (p2.username = p1.username)
    AND (p2.playid = p1.playid);

- 这可能是您正在寻找的。我假设您希望根据播放 ID按用户名 获得最新余额:

SELECT
    playid,
    username,
    balance
FROM
    (
    SELECT
        playid,
        username,
        balance,
        ROW_NUMBER() OVER(PARTITION BY username ORDER BY playid DESC) AS seq
    FROM
        plays
    ) base
WHERE
    seq = 1

这会按用户名对记录进行排序,按 playid 降序排列,然后返回每个记录的最新记录。

【讨论】:

返回错误:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 11 行的 '(PARTITION BY username ORDER BY playid DESC) AS seq FROM play )' 附近使用正确的语法,但我认为这是我需要的。我会继续努力的。谢谢。 遗憾的是,MySQL 没有该功能 - 这就是为什么标记/提及您正在使用的 DBMS 很重要的原因......跨度> 查看更新,让我知道它对您的影响。 完美运行。非常感谢。这是我的第一篇文章,下次我一定会正确标记内容。再次感谢!

以上是关于返回多于一列的 SQL 子查询的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL:ORA-01427:单行子查询返回多于一行

SQL Server:子查询返回多于1个值

SQL 在 select 子查询中只返回一行或 null

返回单行子查询的更新语句返回多于一行

编写一个 sql 查询以使用另一列的子字符串将列添加到数据框

mysql n:m 关系删除查询 1242 子查询返回多于 1 行