MySql 怎么实现 LISTAGG

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySql 怎么实现 LISTAGG相关的知识,希望对你有一定的参考价值。

我在Orcle里写了一个Sql语句,用到了LISTAGG,现在要改成mysql数据库,我要怎么改这个Sql语句?
SELECT A.GUID,A.COMPANY_GUID,A.GOODS_CODE,A.GOODS_NAME,A.SPECIFICATIONS,A.SMALL_IMAGE,A.GOODS_UNIT_GUID,A.STATE,A.MARKET_VALUE,A.INTRODUCE,A.INVENTORY,A.ALARM,A.IAMGE_PATH,A.IS_LOSE,A.CREATE_TIME,A.CREATE_USER,A.MODIFY_TIME,A.MODIFY_USER,U.UNIT_NAME AS GOODS_UNIT_NAME
,LISTAGG(B.GUID,''',''') WITHIN GROUP (ORDER BY B.GUID) AS GOODS_TYPE_GUID
FROM B1_GOODS A
LEFT JOIN B1_UNIT U ON U.GUID = A.GOODS_UNIT_GUID
LEFT JOIN B1_GOODS_TYPE_RELATION T ON A.GUID = T.GOODS_GUID
LEFT JOIN B1_GOODS_TYPE B ON T.GOODS_TYPE_GUID = B.GUID
WHERE 1=1
GROUP BY A.GUID,A.COMPANY_GUID,A.GOODS_CODE,A.GOODS_NAME,A.SPECIFICATIONS,A.SMALL_IMAGE,A.GOODS_UNIT_GUID,A.STATE,A.MARKET_VALUE,A.INTRODUCE,A.INVENTORY,A.ALARM,A.IAMGE_PATH,A.IS_LOSE,A.CREATE_TIME,A.CREATE_USER,A.MODIFY_TIME,A.MODIFY_USER,U.UNIT_NAME
ORDER BY A.GUID

参考技术A 使用GROUP_CONCAT函数 参考技术B 直接在sql语句后面加一个\G就可以了追问

请问是在哪个位置加\G?它是什么意思?

JOOQ/Oracle listAgg 具有不同的

【中文标题】JOOQ/Oracle listAgg 具有不同的【英文标题】:JOOQ/Oracle listAgg with distinct 【发布时间】:2021-11-27 14:22:09 【问题描述】:

我正在努力使用 JOOQ DSL 构建以下查询 - 因为我无法将 distinct 关键字引入 JOOQ 生成的查询中。我将如何做到这一点? 在 listAgg 方法后面创建的 ListAgg-Object 将 distinct 的标志作为值,但由于 ListAgg 是包私有的,我无法访问它。有没有办法利用这个标志或任何其他方式来实现这一点?

Oracle SQL

select distinct DATA.*, LISTAGG(distinct ORGANISATIONS.LABEL, ', ') WITHIN GROUP (ORDER BY DATA.ID),
        from DATA
            join ORGANISATIONS
            on DATA.ORG_ID= ORGANISATIONS.ID
        group by DATA.fields()

JOOQ

create.selectDistinct(DATA.asterisk(), listAgg(ORGANISATIONS.LABEL, ", " ).withinGroupOrderBy(DATA.ID).as("ORG_LABELS"))
                .from(DATA)
                .join(ORGANISATIONS).on(DATA.ORG_ID.eq(ORGANISATIONS.ID))
                .groupBy(DATA.fields())
                .fetch()

顺便说一句,表名已被简化。

非常感谢任何意见。

【问题讨论】:

我发现了这个问题:github.com/jOOQ/jOOQ/issues/7104,我相信目前 jOOQ DSL 无法做到这一点。所以你可能想在 GitHub 上添加一个问题 【参考方案1】:

目前还不支持聚合函数,见:https://github.com/jOOQ/jOOQ/issues/7104

您可以使用plain SQL templating 构建自己的:

static Field<String> listAggDistinct(
    Field<String> field, 
    String separator, 
    OrderField<?> orderBy
) 
    return DSL.field(
        "listagg(distinct 0, 1) within group (order by 2)",
        field.getDataType(),
        field,
        DSL.inline(separator),
        orderBy
    );

【讨论】:

非常感谢您的支持 :)

以上是关于MySql 怎么实现 LISTAGG的主要内容,如果未能解决你的问题,请参考以下文章

一台电脑上怎么实现mysql读写分离

MySql 怎么实现 LISTAGG

mysql怎么实现递归查询数据

怎么实现mysql批量提交数据

MySQL怎么利用函数和触发器实现非主键自增?

PHP,MYSQL怎么实现数据的删除,和查找?