【问题标题】:MYSQL array aggregate function like PostgreSQL array_aggMYSQL 数组聚合函数,如 PostgreSQL array_agg
【发布时间】:2016-08-19 02:10:06
【问题描述】:

我在 MYSQL 上有两张表,不知道 MYSQL 上是否有任何聚合函数 as array_agg() FROM postgreSQL。

TABLE 1 属性只有 8 条记录 表 2 记录了谁捕获了该财产,因此有时同一财产可能是 1 次或 n 次,我得到了这个 Qry:

SELECT p.id, pcb.users_admin_id as uid
FROM properties p
INNER JOIN prop_captured_by pcb ON p.id = pcb.property_id
-- GROUP BY p.id

id    uid
200   1
200   80
202   1
202   80
211   1
211   10
211   81
215   10 ...

如果我使用 GROUP BY 部分,我会得到:

id    uid
200   1
202   1
211   1
215   10 ...

丢失除 users_admin_id 的第一个值之外的任何其他数据。我知道我可以使用 postgreSQL 中的 array_agg() 函数实现我想要的结果,但我不知道如何在 MYSQL 上做到这一点。

这是我渴望的结果:

id    uid
200   1,80 //an array, I don't mind about the separator, could be anything.
202   1,80
211   1,10,81
215   10 ...

我已经尝试过 UNION、GROUP BY、INNER JOIN...没有运气... 有什么指点吗?

更新

我正在使用这个人的many to many relations。希望它对其他人有用。我需要从第三个表中添加用户名,所以最终查询如下所示:

SELECT p.id, group_concat(pcb.users_admin_id) as uid, group_concat(ua.name) as uin
FROM properties p
INNER JOIN prop_captured_by pcb ON p.id = pcb.property_id
INNER JOIN users_admin ua ON ua.id = pcb.users_admin_id
group by p.id;

【问题讨论】:

    标签: mysql


    【解决方案1】:

    你想用GROUP_CONCAT()点赞

    SELECT p.id, group_concat(pcb.users_admin_id) as uid
    FROM properties p
    INNER JOIN prop_captured_by pcb 
    ON p.id = pcb.property_id
    group by p.id;
    

    【讨论】:

    • 它返回一个字符串。如何/是否可以在HAVING p.id NOT IN AGG(pcb.any) 中使用它?
    【解决方案2】:

    MySQL 5.7.22 引入了JSON_ARRAYAGG()JSON_OBJECTAGG()。由于您也需要用户名,因此可以使用后者:

    SELECT p.id, JSON_OBJECTAGG(pcb.users_admin_id, ua.name) as uin
    FROM properties p
    INNER JOIN prop_captured_by pcb ON p.id = pcb.property_id
    INNER JOIN users_admin ua ON ua.id = pcb.users_admin_id
    group by p.id;
    

    DB Fiddle

    【讨论】:

      【解决方案3】:

      我想你想要group_concat():

      SELECT p.id, GROUP_CONCAT(pcb.users_admin_id) as uids
      FROM properties p INNER JOIN
           prop_captured_by pcb
           ON p.id = pcb.property_id
      GROUP BY p.id;
      

      这会生成一个逗号分隔的字符串,但这与您在 MySQL 中获得的数组一样接近。

      【讨论】:

        猜你喜欢
        • 2012-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-26
        相关资源
        最近更新 更多