从 table 中获取与一列中的值匹配且在另一列中以逗号分隔的字符串中存在子字符串的行

Fetch row from table which matches a value in one column and presence of sub-string in comma separated string in other column

问题如何找到与一列中的值匹配的行(使用=运算符)并且其他列应该有一个子字符串(使用find_in_set或其他子字符串匹配) .

场景 : 我有三个 mysql tables:

1. Figures:它包含 id、name、create-by、created-on、modified-on、status 等数字的详细信息。为方便起见,我只提到了两列:

 id |  name 
 1  | red green yellow circle
 2  | red square in yellow circle
 3  | 3D yellow red trapezium

2。 Attributes :它存储不同的属性,每个属性的所有可能的逗号分隔值。

id  |  term     | value
 1  |  shape    | circle,square,rectangle,parallelogram,trapezium
 2  |  color    | red,green,yellow,blue,white,orange
 3  | dimension | 1D,2D,3D

3。 Figure Attribute Mapping:它存储图形、属性的映射,并且仅存储适用于该特定图形属性组合的逗号分隔值。

id | figure_id | attribute_id | value
 1 | 1         | 1            | circle
 2 | 1         | 2            | red,green,yellow
 3 | 2         | 1            | circle,square
 4 | 2         | 2            | red,yellow
 5 | 3         | 1            | trapezium
 6 | 3         | 2            | yellow,red
 7 | 3         | 3            | 3D

Objective : 我想写一个查询 returns 我 figure_id 来自figure_attribute_mapping table 在该属性图形映射行中匹配属性值。

案例一:搜索方形图形。 我的查询:

Select figure_id from figure_attribute_mapping 
where (attribute_id = 1 AND find_in_set('square',value)<>0);

预期答案:2 结果:阳性

案例二:搜索红色图形。 我的查询:

select figure_id from figure_attribute_mapping 
where (attribute_id = 2 AND find_in_set('red',value))

预期答案:1、2、3 结果:阳性

案例三:搜索红色方块。 我的查询:

select figure_id from figure_attribute_mapping 
where 
      (attribute_id = 1 AND find_in_set('square',value)<>0) 
  AND (attribute_id = 2 AND find_in_set('red',value)<>0)

预期答案:2 结果:否定

案例四:搜索黄色圆圈图中的红色方块。 我的查询:

 select figure_id from figure_attribute_mapping 
where
  ( 
       (attribute_id = 1 AND find_in_set('square',value)<>0) 
  AND  (attribute_id = 1 AND find_in_set('circle',value)<>0)
  ) 
AND
 ( 
       (attribute_id = 2 AND find_in_set('red',value) <>0) 
  AND (attribute_id = 2 AND find_in_set('yellow',value)<>0) 
 )

预期答案:2 结果:否定

当属性类型相似时,我能够找到figure_id,但当多个属性出现问题时,我找不到figure_id。

有人可以帮助创建 mysql 查询吗?

一种解决方案是按 figure_id 对行进行分组,然后通过串联搜索属性 value

以下是针对每个案例的查询:

案例一:

SELECT z.* FROM (
    SELECT id, figure_id, GROUP_CONCAT(value) AS merged_value
    FROM figure_attribute_mapping
    GROUP BY figure_id
) z
WHERE FIND_IN_SET('square', z.merged_value);

Output

id     | figure_id | merged_value
+------+-----------+--------------------------+
|    3 |         2 | circle,square,red,yellow

案例二:

SELECT z.* FROM (
    SELECT id, figure_id, GROUP_CONCAT(value) AS merged_value
    FROM figure_attribute_mapping
    GROUP BY figure_id
) z
WHERE FIND_IN_SET('red', z.merged_value);

Output

| id   | figure_id | merged_value             |
+------+-----------+--------------------------+
|    1 |         1 | circle,red,green,yellow  |
|    3 |         2 | circle,square,red,yellow |
|    5 |         3 | trapezium,yellow,red,3D  |

案例三:

SELECT z.* FROM (
    SELECT id, figure_id, GROUP_CONCAT(value) AS merged_value
    FROM figure_attribute_mapping
    GROUP BY figure_id
) z
WHERE FIND_IN_SET('square', z.merged_value)
AND FIND_IN_SET('red', z.merged_value);

| id   | figure_id | merged_value             |
+------+-----------+--------------------------+
|    3 |         2 | circle,square,red,yellow |

案例四:

SELECT z.* FROM (
    SELECT id, figure_id, GROUP_CONCAT(value) AS merged_value
    FROM figure_attribute_mapping
    GROUP BY figure_id
) z
WHERE FIND_IN_SET('square', z.merged_value)
AND FIND_IN_SET('circle', z.merged_value)
AND FIND_IN_SET('red', z.merged_value)
AND FIND_IN_SET('yellow', z.merged_value);

Output

| id   | figure_id | merged_value             |
+------+-----------+--------------------------+
|    3 |         2 | circle,square,red,yellow |