mysql的字段存的是id,并且以逗号分开

嗨,今天想和大家聊聊 SQL 查询中的一种技巧。
有时候我们需要根据特定的条件来筛选数据,比如这里有个查询语句:
sql select from test where id='8 ' or id like '8 ,%' or id like '%,8 ,%' or id like '%,8 '
这个查询语句的目的是找出 test 表中 id 字段满足以下任一条件的记录:
id 等于 '8 '
id 以 '8 ' 开头,后面跟着任意数量的其他字符(用 % 表示)
id 包含 '8 ' 且 '8 ' 前后都有其他字符
id 以任意数量的其他字符开头,以 '8 ' 结尾
为了更简洁地表达这个查询,我们可以使用 [con_cat] 函数,把 id 字段和指定的分隔符 '&'(这里假设分隔符是 '&',你可以根据实际情况修改)组合起来,然后再用 like 进行模糊匹配:
sql select from test where con_cat('&', id, '&') like '%&8 &%'
在这个查询中,[con_cat] 函数会将 id 字段中的值用 '&' 分隔,然后整个结果再用 %&8 &% 进行模糊匹配。
这样就能达到和前面那种多条件查询相同的效果,而且代码更加简洁。

不过要注意,这里 [con_cat] 函数的使用可能受到一些平台的限制,比如在某些搜索引擎或论坛中可能会被屏蔽。
所以如果遇到这种情况,可能需要用其他方式来实现类似的功能,比如直接使用前面那种多条件的查询方式。

总之,SQL 查询中有很多种技巧和方法,我们可以根据具体的需求来选择最合适的方式。
希望今天的分享能对大家有所帮助!

MySQL 中将使用逗号分隔的字段转换为多行数据

在MySQL里头,咱们有时候会遇到字段里用逗号分隔的数据,想把它拆分开来变成多行数据,对吧?这事儿其实挺简单的,就按这几步来操作:
首先,咱们得利用一个辅助表,这个表就是MySQL自带的help_topic表。
这个表的特点就是它的id字段从0开始,一直递增,总共有7 01 条数据,正好用在这里。
咱们把bus_mark_info表跟help_topic表关联一下,就能根据pages字段里逗号的数量,生成对应数量的数据行。

接下来,咱们要使用SUBSTRING_INDEX函数。
这个函数很厉害,能从字符串里截取从开始位置到指定分隔符出现第N次之前的子字符串。
咱们得用两次这个函数。
第一次是用它截取从开始位置到help_topic_id+1 个逗号之前的部分,第二次是用它截取这个部分中最后一个逗号之后的部分,这样就能得到分割后的单个页面数据了。

然后,咱们就得写一条SQL迁移语句了。
这条语句的作用就是把刚才分割好的数据插入到新表bus_pages中。
SQL语句大概是这样:
sql INSERT INTO bus_pages SELECT TRIM(','), 1 ) AS page, b.id AS mark_info_id, /其他字段的默认值或计算值/ FROM bus_mark_info b JOIN help_topic ht ON ht.id < LENGTH> 在这条SQL语句里,LENGTH(b.pages) + 1 的意思是计算pages字段中逗号的数量加1 ,这样就能确保关联条件是正确的。

最后,还有几个注意事项得提醒大家。
因为help_topic表的id最大值是7 00,所以这个方法只适用于处理最多7 01 个逗号分隔的数据。
如果数据里的逗号数量超过了这个数,那咱们就得考虑用其他方法了,比如自定义一个辅助表,或者用存储过程。
而且,在迁移数据之前,一定要确保新表bus_pages的结构已经正确创建,并且包含了所有必要的字段。

总之,通过这几步,咱们就能把MySQL里用逗号分隔的字段转换成多行数据,并且顺利地迁移到新表中去了。

MySQL 中将使用逗号分隔的字段转换为多行数据

好嘞,咱们聊聊开发里头经常遇到的一个小坎儿:处理那些用逗号连起来的字段。
有时候为了方便查询或者迁移数据,就得想办法把它们拆分开来。
下面就给大家分享一个我碰到的实际场景和我的解决方案。

事情是这么样的:我们有个叫 bus_mark_info 的工单信息表,里面有个 pages 字段,本来是存多个页面信息的,但它老兄不识好歹,用的是逗号把页面给串起来了。
现在业务发展了,公司决定要精细化运营,每个页面都得单独配置,还得加上其他一堆属性。
这可咋办呢?显然,原来的 pages 字段是没法满足需求的了。

思来想去,我琢磨着得建个新表 bus_pages 来专门管理这些页面信息。
那问题来了,怎么把老表里的数据给迁移过去呢?这就成了我们接下来要解决的核心问题。

首先,得写SQL语句来把数据从老表里捞出来,再通过 INSERT INTO ... SELECT 这种骚操作,把数据塞到新表里。
这里我打算用MySQL自带的 help_topic 表来帮忙。
为啥选它呢?因为它有个特别适合的特性:id 字段是从0开始一直往上递增的,而且数据量固定是7 01 条。
这玩意儿正好能帮我们按需生成关联数据。

具体来说,对于 bus_mark_info 表里的每一条记录,我们希望生成的关联数据条数,就等于 pages 字段里逗号的个数加1 比如说,如果一个工单的 pages 字段是 "page1 ,page2 ,page3 ",那我们就希望生成3 条关联数据,分别对应 page1 、page2 和 page3 通过设置正确的关联条件,我们就能确保每条记录都能生成我们想要的数据量。

接下来,就得用 SUBSTRING_INDEX 这个好用的函数来根据 help_topic_id 去截取 pages 字段里的数据了。
这个过程稍微有点绕,得分两步走:
1 . 首先截取从开始位置到 help_topic_id + 1 个逗号之前的部分。
2 . 然后在这个部分里,再截取最后一个逗号之后的部分。

通过这两步操作,我们就能利用 help_topic_id 和 SUBSTRING_INDEX 函数,把 pages 字段里的数据给成功分割开,并且存入新表 bus_pages 里。

当然,这里用 help_topic 表是有前提条件的,就是它得具备 id 递增这种特性。
如果咱们用的是其他数据库,或者表的结构不太一样,那可能就得另寻他法了。
而且,因为 help_topic 表 id 最大只有7 00,所以它最多只能处理7 01 个页面连接的数据。
如果页面连接数超过了这个数,那咱们就得去找其他更长的表来用了。

对于不太熟悉 SUBSTRING_INDEX 函数和 INSERT INTO ... SELECT 语句的同学,我建议你们回去翻翻以前的文章,我再详细讲讲它们是怎么用的。
这里就不展开了,免得篇幅太长。

最后,把写好的SQL语句执行一下,新表 bus_pages 就会根据咱们的需求被成功填充数据了。

总的来说,在实际开发中,通过巧妙地运用SQL里的 SUBSTRING_INDEX 函数,再结合一些具有特定特性的表,咱们就能有效地处理那些用逗号连接起来的字段数据,实现数据的查询、迁移、关联和拆分,最终达到咱们想要的数据处理目的。
希望这个分享对大家有帮助!