如何在MariaDB中合并重复SQL行,聚合用户关联权限ID
解决方案:合并用户权限为逗号分隔字符串(MariaDB + jOOQ适配)
正确的MariaDB SQL语句
你需要结合GROUP_CONCAT和GROUP BY,对用户的唯一属性进行分组,才能正确聚合同一用户的权限ID:
SELECT users.id, users.name, users.description, GROUP_CONCAT(users_principles.principleId ORDER BY users_principles.principleId SEPARATOR ', ') AS PRINCIPLES FROM users JOIN users_principles ON users_principles.userId = users.id WHERE users.id > 0 GROUP BY users.id, users.name, users.description;
GROUP_CONCAT中的ORDER BY是可选配置,用于保证权限ID按有序排列;SEPARATOR显式指定分隔符,默认值为逗号,这里写出更便于维护。- 必须将
users.id、users.name、users.description全部加入GROUP BY,确保每个分组对应唯一用户(MariaDB严格模式下要求非聚合字段必须在GROUP BY中,避免返回结果异常)。
jOOQ适配写法
对应jOOQ的实现代码如下(假设已生成表实体类):
Result<Record4<Long, String, String, String>> result = dslContext .select( USERS.ID, USERS.NAME, USERS.DESCRIPTION, DSL.groupConcat(USERS_PRINCIPLES.PRINCIPLEID) .orderBy(USERS_PRINCIPLES.PRINCIPLEID) .separator(", ") .as("PRINCIPLES") ) .from(USERS) .join(USERS_PRINCIPLES).on(USERS_PRINCIPLES.USERID.eq(USERS.ID)) .where(USERS.ID.gt(0)) .groupBy(USERS.ID, USERS.NAME, USERS.DESCRIPTION) .fetch();
这段代码会生成与上述SQL等价的查询逻辑,完全适配你的需求。
内容的提问来源于stack exchange,提问作者Stepping Traveler
相关产品推荐
相关产品推荐

