【问题标题】:MySQL - GROUP_CONCAT if value is not a substringMySQL - 如果值不是子字符串,则为 GROUP_CONCAT
【发布时间】:2015-06-08 10:59:31
【问题描述】:

我的表中有一个名为“权限”的列。权限是字符串,可以是: "r","w","x","rw","wx","rwx","xwr" 等请注意字符串中字符的顺序不是固定的。我想GROUP_CONCAT() 在我的表的“权限”列上。然而,这会导致非常大的字符串。

示例:"r","wr","wx" 连接的组是 "r,wr,wx",但应该是 "r,w,x""rwx"。使用distinct() 子句似乎没有多大帮助。我在想,如果我可以检查权限值是否是另一列的子字符串,那么我不应该将它连接起来,但我似乎没有找到实现这一点的方法。

任何仅使用字符串函数的基于列的方法也会受到欢迎。

编辑: 以下是一些示例数据:

+---------+
| perm    |
+---------+
| r,x,x,r |
| x       |
| w,rw    |
| rw      |
| rw      |
| x       |
| w       |
| x,x,r   |
| r,x     |
+---------+

连接的结果应该是:

 +---------+
 | perm    |
 +---------+
 | r,w,x   |
 +---------+

我无法控制数据源并且不想创建新表(因为受限权限和内存限制)。我正在寻找将每列值转换为所需格式的后处理步骤。

【问题讨论】:

  • 提示:在这里考虑 SET,而不是文本字符串。
  • 也许你的几行样本数据和预期结果会帮助人们更好地理解你的问题。

标签: mysql group-by group-concat


【解决方案1】:

一个好主意是首先规范化您的数据。

例如,您可以尝试这种方式(我假设您的源表名为 Files):

  1. 创建名为 PermissionCodes 的简单表,其中只有名为 Code 的列(字符串类型)。

  2. rwx 作为值放入PermissionCodes(共三行)。

  3. 在子查询中将Files 连接到PermissionCodes,条件是Code 作为Permissions 中的子字符串存在。

  4. 对子查询的结果执行 GROUP_CONCAT 聚合。

如果是这种情况,对于Files 中的相同逻辑整体,存在多个重叠的权限集(即,对于某些文件,有一行带有rw,另一行带有w)那么你会将您的子查询限制为 distinct Files' 键和 Code 的组合。

这是一个演示这个想法的小提琴:

http://sqlfiddle.com/#!9/6685d6/4

【讨论】:

    【解决方案2】:

    你可以试试这样的:

    SELECT user_id, GROUP_CONCAT(DISTINCT perm)
    FROM Permissions AS p
    INNER JOIN (SELECT 'r' AS perm UNION ALL 
                SELECT 'w' UNION ALL
                SELECT 'x') AS x
    ON p.permission LIKE CONCAT('%', x.perm, '%')
    GROUP BY user_id
    

    您可以在用于JOINPermissions 表的派生表的UNION ALL 中包含任何额外的权限代码。

    Demo here

    【讨论】:

    • 类似于 Kuba 的解决方案。非常感谢帮助。谢谢。
    猜你喜欢
    • 2018-11-09
    • 1970-01-01
    • 2017-10-19
    • 2019-11-01
    • 2022-11-12
    • 1970-01-01
    • 1970-01-01
    • 2020-10-03
    • 1970-01-01
    相关资源
    最近更新 更多