mysql - 如何在我的 SQL 查询中根据逗号分隔数据中的逗号分隔参数查找数据
问题描述
我们有以下数据,
plant table
----------------------------
| name | classification |
| A | 1,4,7 |
| B | 2,3,7 |
| C | 3,4,9,8 |
| D | 1,5,6,9 |
现在从前端,他们将发送多个参数,如“4,9”,目标输出应该是这样的
plant table
---------------------------
| name | classification |
| A | 1,4,7 |
| C | 3,4,9,8 |
| D | 1,5,6,9 |
已经尝试使用 FIND_IN_SET 代码,但只能使用 1 个参数获取
select * from plant o where find_in_set('4',classification ) <> 0
另一种解决方案是通过执行多个查询,例如如果参数为“4,9”,那么我们使用参数 4 和 9 循环查询两次,但实际上该解决方案将消耗大量资源,因为数据约为 10000+ 行而参数本身实际上可以超过5个参数
如果表格设计不好,那么可以,但我们无法更改它,因为表格是第三方的
任何解决方案或任何见解将不胜感激,谢谢
解决方案
架构 (MySQL v8.0)
CREATE TABLE broken_table (name CHAR(12) PRIMARY KEY,classification VARCHAR(12));
INSERT INTO broken_table VALUES
('A','1,4,7'),
('B','2,3,7'),
('C','3,4,9,8'),
('D','1,5,6,9');
查询 #1
WITH RECURSIVE cte (n) AS
(
SELECT 1
UNION ALL
SELECT n + 1 FROM cte WHERE n < 5
)
SELECT DISTINCT x.name, x.classification FROM broken_table x JOIN cte
WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(classification,',',n),',',-1) IN (4,9);
姓名 | 分类 |
---|---|
一个 | 1,4,7 |
C | 3,4,9,8 |
D | 1,5,6,9 |
编辑:
或者,对于旧版本...
SELECT DISTINCT x.name, x.classification FROM broken_table x JOIN
(
SELECT 1 n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5
) cte
WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(classification,',',n),',',-1) IN (4,9)
推荐阅读
- c# - 使用 RSA-SHA256 签名
- python - 程序未正确加载图像
- python - 构建python包:如何在包的主脚本中调用非代码文件
- python - 如何在 Python 中计算 s 字符串的权重?
- json - 如何更新 React js 中嵌套对象的状态,在我的示例中是 DeviceProperties(IPAddress、用户名和密码)
- c++ - 低质量 H.265 媒体基础编码?
- image - 可缩放的 xamarin 圆形图像
- java - 微调器 onItemSelectedListener 不起作用?
- firebase - Unity:在 DynamicLinkReceived 回调事件中接收 Firebase 短动态链接
- jenkins - 如何在詹金斯管道 groovy 文件中使用 withcredentials 设置多个凭据