mysql根據逗號分割的字符串去關聯查詢另外一個表的數據


1、說明

在做顯示數據的時候,一個字段會存那種逗號分割的字符串,那如何去根據逗號分割字符串去查詢另一個表的數據呢?

首先我們查看一下需要顯示的數據

select * from company where f_id in ('210','205','208')

select * from company where f_id in ('210,205,208')

 

現在我要根據另一張模板表中的一個字段查詢他下面的公司,存的是字符串類型

這時

 

select * from company where f_id in (select company_id from templet where f_id=583)

 

 

只查詢出一條數據,說明他查詢的結果是一個字符串'210,205,208',而我們需要的是'210','205','208',

這時會想到分割,但是發現需要循環很麻煩。這里提供正則表達式的方式解決如下

先把字符串替換成正則需要的樣式,把‘210,205,208’轉成210|205|208,再用正則匹配

 

SELECT
    GROUP_CONCAT(f_tran_type_name)
FROM
    company
WHERE
f_id REGEXP (
SELECT
   REPLACE (
  (
   SELECT
       company_id
FROM
    templet
   WHERE
       f_id = 583
   ),
     ',',
   '|'
)
)

 

2、優化

我們可以根據自己的需要寫一個函數

def replace_sql(table, value, conditions):
    '''
    根據逗號分割的字符串去關聯查詢另外一個表的數據
    @table,表名-list[table1(存字典表), table2(存分割的字符串的表)]
    @value,返回的字段-list[table1_str, table2_str, table1_where_str]
    @conditions, 條件-dict
    '''
    sql = """SELECT GROUP_CONCAT({table1_str}) `names` FROM {table1} WHERE
                {table1_where_str} REGEXP (SELECT REPLACE ((SELECT {table2_str} FROM
                {table2} WHERE {con} ),',','|'));
        """
    con = dict_2_str(conditions)
    res_sql = sql.format(table1=table[0], table2=table[1],
                         table1_str=value[0], table2_str=value[1], table1_where_str=value[2],
                         con=con)
    return res_sql


def dict_2_str(dictin):
'''
將字典變成,key='value',key='value' 的形式
'''
tmplist = []
for k, v in dictin.items():
tmp = "%s='%s'" % (str(k), str(v))
tmplist.append(' ' + tmp + ' ')
return ','.join(tmplist)

 

 

 

如看詳細https://www.cnblogs.com/edison20161121/p/7839950.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM