在用于缩小 concat 结果的 GROUP CONCAT 子查询中找不到表别名

Posted

技术标签:

【中文标题】在用于缩小 concat 结果的 GROUP CONCAT 子查询中找不到表别名【英文标题】:Table alias not found in GROUP CONCAT sub-query used to narrows down concat results 【发布时间】:2021-06-28 10:12:35 【问题描述】:

我正在尝试创建一个查询,在附加列中列出每个用户和用户的 transactionId。 每个用户可以有多个事务,其中 User.userId = Transaction.userId。当我使用下面的查询时,我收到一个错误,它无法识别用户的别名 U1:

错误代码:1054。“where 子句”中的未知列“U1.userId”

子查询 sub1 用于缩小将由 GROUP_CONCAT 连接的结果。

在 GROUP_CONCAT 的子子查询中,有一些类似的问题涉及未找到的别名,但没有一个别名。

SELECT
    *,
    (
        SELECT
            GROUP_CONCAT(transactionId SEPARATOR ',')
        FROM (
            SELECT * FROM Transaction AS T1
            WHERE T1.userId = U1.userId
        ) as sub1
    ) as transactionIds
FROM
    User as U1

有谁知道如何达到预期的效果?用户行以及汇总用户事务 ID 的附加列。

【问题讨论】:

【参考方案1】:

不需要子查询。

SELECT
    *,
    (
        SELECT
            GROUP_CONCAT(transactionId SEPARATOR ',')
        FROM Transaction AS T1
            WHERE T1.userId = U1.userId
    ) as transactionIds
FROM
    User as U1

我已经包含了子查询,因为我正在寻找一种方法来限制结果,以防我不需要所有的 id。

SELECT
    *,
    (
        SELECT
            SUBSTRING_INDEX(GROUP_CONCAT(transactionId ORDER BY transactionId SEPARATOR ','), ',', needed_amount)
        FROM Transaction AS T1
            WHERE T1.userId = U1.userId
    ) as transactionIds
FROM
    User as U1

不要忘记将@@group_concat_max_len 调整为合理但足够的值。

【讨论】:

这似乎可以解决问题,我已经包含了子查询,因为我正在寻找一种方法来限制结果,以防我不需要所有的 id。此解决方案取自 ***.com/a/44926956/2099823。这是否意味着您可以只使用 LIMIT 而不使用子查询? @Gijs 已更新。使用needed_amount 代替 LIMIT。此外,它可以不是常量,而是用户定义的变量,甚至是表达式(在不同的行中给出不同的 ID 数量)。

以上是关于在用于缩小 concat 结果的 GROUP CONCAT 子查询中找不到表别名的主要内容,如果未能解决你的问题,请参考以下文章

SQLite:group_concat 似乎只拉第一行?

将 group_concat 的结果集限制为实际结果

MySQL中函数CONCAT及GROUP_CONCAT

MySQL中函数CONCAT及GROUP_CONCAT

MySQL中函数CONCAT及GROUP_CONCAT

MySQL中函数CONCAT及GROUP_CONCAT