MySql通过将多个值拆分为||
下面是MySql通过将多个值拆分为||,mysql,sql,database,Mysql,Sql,Database,下面是SELECTquery的结果集 mysql> select * from mytable where userid =242 ; +--------+-----------------------------+------------+---------------------+---------------------+ | UserId | ActiveLinks | ModifiedBy | DateCreated | Date
SELECT
query的结果集
mysql> select * from mytable where userid =242 ;
+--------+-----------------------------+------------+---------------------+---------------------+
| UserId | ActiveLinks | ModifiedBy | DateCreated | DateModified |
+--------+-----------------------------+------------+---------------------+---------------------+
| 242 | 1|2|4|6|9|15|22|33|43|57|58 | 66 | 2013-11-28 16:17:25 | 2013-11-28 16:17:25 |
+--------+-----------------------------+------------+---------------------+---------------------+
我想要的是通过拆分活动链接列并将其与UserId以以下格式关联来选择记录
例如
有人能帮我解答这个问题吗?到目前为止,我还没有想到什么。谢谢处理存储在数据中的列表是一件痛苦的事。在MySQL中,可以使用子字符串\u index()
。以下操作应满足您的要求:
SELECT userid,
substring_index(substring_index(l.ActiveLinks, '||', n.n), '|', -1) as link
FROM (select 1 as n union all select 2 union all select 3 union all select 4) n join
ipadminuserslinks l
on length(l.ActiveLinks) - length(replace(l.ActiveLinks, '||', '')) + 1 <= n.n
WHERE userid = 242;
选择userid,
子串索引(子串索引(l.ActiveLinks,“| |',n.n),“|',-1)作为链接
从(选择1作为n联合所有选择2联合所有选择3联合所有选择4)n加入
ipadminuserslinks l
关于length(l.ActiveLinks)-length(replace(l.ActiveLinks,“| |,”,”)+1我将创建一个以分隔符作为参数的例程。
另一个风险是通讯线路
每次调用它时,它都会返回所调用的UserId的一组值。
它将基本上使用一个基于“|”计数的循环(我们称之为管道)
通过这种方式,您可以实现@Gordon Linoff提出的解决方案,而无需知道您有多少个活动链接。如果这只是一个与另一个表上的任何内容都不相关的值列表,我将采用与Gordon相同的方法(如果需要,您可以交叉连接获取数字列表的子查询,以轻松生成更大的数字范围)。一个小问题是,如果数字范围大于行上的分隔值数量,则最后一个值将重复(在这种情况下,使用DISTINCT很容易删除,当其中存在要保留的重复值时,会更加复杂)
但是,如果分隔值列表与另一个表相关(例如作为另一个表的id字段),则可以通过以下方式执行:-
SELECT a.UserId, b.link_id
FROM mytable a
LEFT OUTER JOIN my_link_table b
ON FIND_IN_SET(b.link_id, replace(a.ActiveLinks, '|', ','))
例如,使用FIND|u IN_SET将您的表与相关表连接起来。在这种情况下,将用作分隔符的任何|符号转换为逗号,以允许FIND|u IN_SET工作。复制您最好修复您的数据库模型。存储分隔值几乎总是一个坏选择谢谢,我知道结构不好,所以只能将所有旧记录迁移到新的N标准化数据库Tables@CodingAnt每个数据库开发人员都会在某个时间点接收到非规范化的数据。他可以通过后端以规范化的方式创建触发器或记录数据,但历史数据需要根据新的规范化规则进行调整。
SELECT a.UserId, b.link_id
FROM mytable a
LEFT OUTER JOIN my_link_table b
ON FIND_IN_SET(b.link_id, replace(a.ActiveLinks, '|', ','))