我有一个名为ACCOUNT_REFunds的表:

id |  referrals(type json) |  accountID 
___________________________

123 |  [1,2]               |   001  
124 |  [3]                 |   001 
125 |  [4]                 |   001 
126 |  [5,6,7]             |   001
127 |  [4]                 |   001

在这个表中,我得到了一些帐户,可以根据他们的推荐获得多次退款,(推荐用户的ID存储在推荐列中)如果他们将一项服务推荐给某人,他们将得到退款.这是一个非常简单的逻辑,然而,我的主要问题是,我需要过滤出该帐户是否已经为推荐用户退款.例如,如果有ID为4的用户退款的记录,我不想创建另一笔退款.因此,我的目标是按相同的帐户ID Select 所有记录,将引用列合并为一个数组,并对其进行筛选.因此,最终结果将如下所示: [1,2,3,4,5,6,7]得到这个值后,我只需在该数组中查找该用户ID.

select af.id, af.referrals, af.accountID
 from ns_accounts_refunds af
inner join ns_accounts a on a.id = 001
 join ns_accounts_refunds af 
where  af.accountID = a.id

预期结果:

id |  referrals(type json) |  accountID 
___________________________

123 |  [1,2]               |   001  
124 |  [3]                 |   001 
125 |  [4]                 |   001 
126 |  [5,6,7]             |   001

将不会 Select 引用列数组中共享相同用户ID的最后一行

提前谢谢!

推荐答案

下面是如何使用JSON_TABLE来将数组拆分为行,然后使用聚合函数MIN()过滤掉重复项之后再用JSON_ARRAYAGG来取回数组:

WITH CTE AS (
  SELECT accountID, refID, MIN(id) AS id
  FROM account_refunds
  CROSS JOIN JSON_TABLE(
         referrals,
         "$[*]"
         COLUMNS(
           refID INT PATH "$"
         )
       ) t
  GROUP BY accountID, refID
)
SELECT id, JSON_ARRAYAGG(refID) AS referrals, accountID
FROM CTE
GROUP BY accountID, id;

结果:

id  referrals   accountID
123 [1, 2]      001
124 [3]         001
125 [4]         001
126 [5, 6, 7]   001

Demo here

Mysql相关问答推荐

配置MySQL服务器以管理数千个表

如何在WooCommerce中更新pm_Virtual.meta_Value=#39;否

数组上的MySQL、JSON_CONTAINS用法

无法连接到扩展坞MySQL Unix套接字

计算同一个表中的两列,然后将两者都算作总数

为什么 `count` 函数有效但 `sum` 无效?

使用 Having 表达式连接多个表

创建将列与多个值进行比较的索引

MySQL UPDATE 锁会因为连续的 SHARE 锁而饿死吗?

为什么从我的 SQL 查询中删除 BINARY 函数调用会如此显着地改变查询计划?

如何在 Laravel 5.1 中获取数据库中的表列表

Spring Boot:Jdbc javax.net.ssl.SSLException:在接收对等方的 close_notify 之前关闭入站

在 MySQL 中重命名外键列

MySQL如何为数据库中的所有表生成DDL

由于在 MySQL 中使用保留字作为表名或列名导致的语法错误

SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #3 不在 GROUP BY 子句中并且包含非聚合

如何将数组存储到mysql中?

你能推荐一个免费的 Linux 轻量级 MySQL GUI 吗?

在 MySQL 中仅 Select 仅包含字母数字字符的行

如何在 MYSQL 中使用 SQL 在两个日期时间值之间减go 并以分钟或秒为单位检索结果?