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

来源:互联网 发布:linux terminal 字体 编辑:程序博客网 时间:2024/06/05 12:45

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


如何才能直接用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  
        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


0 0
原创粉丝点击