我有一个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按照药品名称的长度降序排序,选择最相似的药
你就是想查找的时候也能匹配到查找字段本身对吧,我给你完成了多个例子的测试
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数据库中无法直接根据字段名来筛选出包含指定字符串的记录。一般情况下,数据库是根据字段值来进行数据查询的,而不是字段名。不过可以通过一些方法来实现类似的功能。
第一种方法是使用动态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; ```
第二种方法是通过将数据库数据导出为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本身是不太好做的,但是解决问题的话,主要还是要看我们自己的思维逻辑,可以采用大数据分词的做法。
我给你提供一个反向思维逻辑可以解决这个问题:
比如:“感冒灵颗粒” 是你的查询参数,那就把它分词处理成:“感冒”、“颗粒”、“感冒灵”
MYSQL数据库使用instr函数筛选被字符吕包含的字段
select * from table where INSTR( 字段名 , "药名" ) > 0