Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySql通过将多个值拆分为||_Mysql_Sql_Database - Fatal编程技术网

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, '|', ','))