首页 > 解决方案 > 如何在我的 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个参数

如果表格设计不好,那么可以,但我们无法更改它,因为表格是第三方的

任何解决方案或任何见解将不胜感激,谢谢

标签: mysqlsql

解决方案


架构 (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

在 DB Fiddle 上查看

编辑:

或者,对于旧版本...

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) 

推荐阅读