【问题标题】:MySql SELECT by Spliting multiple values separated by ||MySql SELECT 通过拆分由 || 分隔的多个值
【发布时间】:2014-11-13 11:37:23
【问题描述】:

下面是SELECT查询的结果集,

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 |
+--------+-----------------------------+------------+---------------------+---------------------+

我想要的是SELECT通过拆分活动链接列并将其与以下格式的UserId相关联,

例如,

UserId   ActiveLinks 

242       1
242       2
242       4
242       6

任何人都可以帮助我解决这个问题,到目前为止,我没有想到任何事情。谢谢

【问题讨论】:

  • 你最好修复你的数据库模型。存储分隔值几乎总是一个糟糕的选择
  • 谢谢大家,我知道结构不好,所以只能将所有旧记录迁移到新的标准化数据库表
  • 每个数据库开发人员都会在某个时候收到非规范化数据。他可以通过后端创建触发器或以规范化的方式记录数据,但历史数据需要根据新的规范化规则进行调整。

标签: mysql sql database


【解决方案1】:

处理存储在数据中的列表很痛苦。在 MySQL 中,您可以使用substring_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;

第一个子查询生成一堆你需要的数字。您可能需要增加此列表的大小。

on 子句将数字限制为列表中元素的数量。

您可能会说,这相当复杂。使用联结表要容易得多,这是存储此类信息的关系方式。

【讨论】:

    【解决方案2】:

    我将创建一个将分隔符作为参数的例程。 另一个 in_var 将是对应的行。

    每次调用它时,它都会返回被调用的 UserId 的值集。 它基本上会使用一个基于“|”计数的循环(我们称之为管道) 这样您就可以实施@Gordon Linoff 提出的解决方案,而无需知道您有多少活动链接。

    【讨论】:

      【解决方案3】:

      如果这只是一个与另一个表上的任何内容无关的值列表,我会以与 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_IN_SET 将您的表与相关表连接起来。在这种情况下转换任何 |用作逗号分隔符以允许 FIND_IN_SET 工作的符号。

      【讨论】:

        猜你喜欢
        • 2019-05-11
        • 2021-06-14
        • 2013-10-30
        • 1970-01-01
        • 1970-01-01
        • 2019-09-23
        • 2017-03-21
        • 1970-01-01
        • 2018-03-17
        相关资源
        最近更新 更多