MYSQL数据库如何筛选被字符吕包含的字段

我有一个mysql的药品数据库,这个数据库有些特殊
在药品名这个字段里,只有药品的名称,没有剂型,比如:感冒灵,复方地塞米松,六味地黄,肾宝
正常的药品名称是,感冒灵颗粒,复方地塞米松乳膏,六味地黄丸,肾宝糖浆
所以,这里有一个特征,正常的药品名,是包含这个字段的,比如感冒灵颗粒,是包含感冒灵的

我现在要用正常的药品名称,去匹配到这个数据库里,最相似的那个药
我已经试过了MYSQL里的, locate, in_str, find_inset,like函数等
但这些函数,用字符串去找包含它的字段名,而如果字段名被字符串包含,是找不到的

药品表名:drug_table
表中药品名称字段: drug_name

select * from (
select drug_name, '复方地塞米松乳膏' as input_name from drug_table) as t1 where instr(t1.input_name,t1.drug_name)>0

可以考虑把药品名称查询出来,计算相似度

SELECT name
FROM 药品数据库
WHERE '正常药品名称' LIKE CONCAT('%', 数据库药品字段, '%')
ORDER BY LENGTH(数据库药品字段) DESC
LIMIT 1;

CONCAT('%', 数据库药品字段, '%')创建一个包含数据库药品字段字段的模糊匹配模式,然后使用LIKE进行匹配。ORDER BY LENGTH() DESC按照药品名称的长度降序排序,选择最相似的药

你就是想查找的时候也能匹配到查找字段本身对吧,我给你完成了多个例子的测试

img

CREATE TABLE drugs (
    id INT PRIMARY KEY AUTO_INCREMENT,
    drug_name VARCHAR(100)
);
SELECT drug_name
FROM drugs
WHERE drug_name LIKE CONCAT('%', '感冒灵', '%')
ORDER BY LOCATE('感冒灵', drug_name) asc


你好,参考如下
select 药品名称 from 药品表 where 药品名称 REGEXP '[感冒灵颗粒]';

你好,如果满足要求请采纳,谢谢

药品的类别、功效、价格等类别,不能作为条件吗

【以下回答由 GPT 生成】

解决方案

MySQL数据库中无法直接根据字段名来筛选出包含指定字符串的记录。一般情况下,数据库是根据字段值来进行数据查询的,而不是字段名。不过可以通过一些方法来实现类似的功能。

  1. 第一种方法是使用动态SQL,通过拼接字符串的方式生成查询语句。具体步骤如下:

    a. 查询数据库中的表和字段信息,可以使用INFORMATION_SCHEMA.COLUMNS系统视图。

    sql SELECT TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE '%药品名%';

    该查询可以得到包含字段名包含指定字符串的表和字段信息。

    b. 根据第一步得到的表和字段信息,动态生成查询语句。可以使用CONCAT函数拼接字符串。

    sql SELECT * FROM [表名] WHERE [字段名1] LIKE '%[指定字符串]%' OR [字段名2] LIKE '%[指定字符串]%' OR [字段名3] LIKE '%[指定字符串]%' ...

    以上查询语句中的[表名]是根据第一步得到的表名进行替换,[字段名1][字段名2]等是根据第一步得到的字段名进行替换,[指定字符串]是需要指定的字符串。

    c. 执行生成的动态查询语句,可以使用prepared statement来实现。

    sql PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;

    完整的代码示例:

    ```sql SET @sql = NULL;

    SELECT GROUP_CONCAT(CONCAT(' SELECT * FROM ', TABLE_NAME, ' WHERE ', COLUMN_NAME, ' LIKE ''%', '指定字符串', '%''') SEPARATOR ' UNION ALL ') INTO @sql FROM INFORMATION_SCHEMA.COLUMNS WHERE COLUMN_NAME LIKE '%药品名%';

    SET @sql = CONCAT(@sql, ';');

    PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; ```

  2. 第二种方法是通过将数据库数据导出为CSV文件,然后使用其他编程语言来对CSV文件进行处理和查询。可以使用MySQL的SELECT ... INTO OUTFILE语句将查询结果导出为CSV文件。

    a. 导出CSV文件,可以使用以下语句。

    sql SELECT * FROM [表名] WHERE [字段名1] LIKE '%[指定字符串]%' OR [字段名2] LIKE '%[指定字符串]%' OR [字段名3] LIKE '%[指定字符串]%' ... INTO OUTFILE '[文件路径]' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

    其中[表名][字段名1][字段名2]等是根据具体情况进行替换,[指定字符串]是需要指定的字符串,[文件路径]是导出的CSV文件路径。

    b. 使用其他编程语言对导出的CSV文件进行处理和查询。可以使用文件读取和字符串匹配的方法来实现。

    c. 如果需要将查询结果导入到数据库中,可以使用MySQL的LOAD DATA INFILE语句来实现。

    sql LOAD DATA INFILE '[文件路径]' INTO TABLE [表名] FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n';

    其中[文件路径]是导出的CSV文件路径,[表名]是需要导入的数据库表名。

以上方法可以根据具体情况选择使用。如果以上方法都无法满足需求,请提供更多具体的信息和需求,我会尽力帮助你解决问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^

建议增加一个关系表维护药品和关键字的关系,这样方便后面的查询,要不然你的查询效率会很低

这种需求基于myql本身是不太好做的,但是解决问题的话,主要还是要看我们自己的思维逻辑,可以采用大数据分词的做法。
我给你提供一个反向思维逻辑可以解决这个问题:

  1. 先着手你的后端代码:比如java或者其他语言,不限制语言,去把你要查询的参数做一个分词处理:
     比如:“感冒灵颗粒” 是你的查询参数,那就把它分词处理成:“感冒”、“颗粒”、“感冒灵”  
    
  2. 用代码拼装好你想要的sql去模糊匹配查询
    这样应该就可以解决你现在的问题了!

MYSQL数据库使用instr函数筛选被字符吕包含的字段

select * from table where  INSTR( 字段名 , "药名" ) > 0