mysql列值有用逗号隔开的查询处理

我需要写一个查询sql,

select * from sys_user a where a.account_name in (select b.account_name from account b)

,其中in后面的b.account_name的列值,可能有按逗号隔开的值,但是a.account是单个值,这个sql应该如果修改

在这种情况下,你可能需要将 account 表中 account_name 列的每个值拆分开,然后将这些拆分出来的值用于 IN 子句中。你可以通过创建一个临时表或者使用 MySQL 的一些内置函数来实现这个目标。

这里有一个可能的解决方案,使用 FIND_IN_SET 函数:

sql复制代码

SELECT * FROM sys_user a WHERE EXISTS ( SELECT 1 FROM account b WHERE FIND_IN_SET(a.account_name, b.account_name) > 0 );

这个查询将返回 sys_user 表中 account_name 值在 account 表的 account_name 列(其中的值被逗号分隔)中出现的所有记录。FIND_IN_SET 函数将在逗号分隔的列表中查找一个值,如果找到了这个值,就返回这个值在列表中的位置(从 1 开始),否则返回 0。在上面的查询中,EXISTS 子句将对每个 sys_user 记录检查是否存在一个 account 记录,使得 sys_user 记录的 account_name 值出现在 account 记录的 account_name 列中。

注意:由于这个查询使用了 FIND_IN_SET 函数,可能会导致比较低的性能。如果你的数据量比较大,可能需要考虑其他的解决方案,比如将 account 表的数据进行规范化,避免在一个列中存储逗号分隔的值。

有一个sql语句:

select a.account_name,b.display_name from agreement a left join sys_user b on a.account_name = b.account_name

,目的是查询agreement.account_name对应的display_name,但是agreement.account_name字段值有的是按逗号可开的,而syts_user.account_name不是,要实现将用逗号隔开的account_name也能按逗号隔开找到对应的display_name

你可以使用 MySQL 的 FIND_IN_SET 函数来处理逗号分隔的字符串。以下是一个修改后的 SQL 查询语句的例子:

sql复制代码

SELECT a.account_name, GROUP_CONCAT(b.display_name) AS display_names FROM agreement a LEFT JOIN sys_user b ON FIND_IN_SET(b.account_name, a.account_name) > 0 GROUP BY a.account_name;

在这个查询中,FIND_IN_SET(b.account_name, a.account_name) 会在 a.account_name 字段的逗号分隔的字符串中查找 b.account_name 的值。FIND_IN_SET 会返回找到的字符串在列表中的位置(从1开始),如果没有找到则返回0。

GROUP_CONCAT(b.display_name) 则会将所有匹配的 b.display_name 字段的值用逗号连接起来。

需要注意的是,使用 FIND_IN_SET 可能会对性能产生影响,特别是在处理大量数据的时候。如果可能的话,最好将数据结构设计为标准化的关系型数据库结构,避免在一个列中存储逗号分隔的值。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值