数据表存储多id字符串,灵活sql由行转列

一对多没有建立中间表的时候经常会采用分隔符的形式将“多”存储在“一”的一个字段里,这样做的代价是无法像一对多的时候那样直接关联查询,一般采用在程序中分割后分别查询的办法。如下图:


如何才能直接用sql语句查询出下图的效果呢?


可以借助一个序号表,该表中除了连续的id没有其它字段,id的值范围取决于"一"中存储的信息拆分后的数量。


实现sql:

[sql]  view plain  copy
  1. SELECT  
  2.     NAME,  
  3.     REPLACE(  
  4.         SUBSTRING_INDEX(mobile, ',', a.id),  
  5.         CONCAT(  
  6.             SUBSTRING_INDEX(mobile, ',', a.id - 1),  
  7.             ','  
  8.         ),  
  9.         ''  
  10.     )AS mobile  
  11. FROM  
  12.     squence a  
  13. CROSS JOIN(  
  14.     SELECT  
  15.         NAME,  
  16.         CONCAT(mobile, ',')AS mobile,  
  17.         LENGTH(mobile)- LENGTH(REPLACE(mobile, ','''))+ 1 AS size  
  18.     FROM  
  19.         `user`  
  20. )b ON a.id <= b.size  



[sql] 
SELECT  
  1.     mid,  
        REPLACE(  
            SUBSTRING_INDEX(group_id, ',', a.id),  
            CONCAT(  
                SUBSTRING_INDEX(group_id, ',', a.id - 1),  
                ','  
            ),  
            ''  
        )AS group_id  
    FROM  
        (select id from rims_basic_area where id <20) a  
    CROSS JOIN(  
        SELECT  
            id as mid,  
            CONCAT(group_id, ',')AS group_id,  
            LENGTH(group_id)- LENGTH(REPLACE(group_id, ',', ''))+ 1 AS size  
        FROM  
            `rims_message_push_setting`  
    )b ON a.id <= b.size


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值