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

萨尔格

问题如何查找与一列中的值匹配的行(使用=运算符),而另一列应具有子字符串(使用find_in_set或其他子字符串匹配)。

方案:我有三个mysql表:

1.图形:它具有图形的详细信息,例如ID,名称,创建者,创建者,修改者,状态等。为方便起见,我仅提及两列:

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

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

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

3.图形属性映射:它存储图形,属性以及仅适用于该特定图形属性组合的那些逗号分隔值的映射。

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

目标:我想编写一个查询,该查询将在该属性-图形映射行中匹配属性值的情况下,figure_attribute_mapping返回figure_id

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

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结果:否定的

当属性类型相似时,我可以找到fig_id,但是当多个属性出现问题时,则无法找到fig_id。

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

萨米尔

一种解决方案是对行进行分组,figure_idvalue通过串联属性搜索属性

以下是针对每种情况的查询:

情况一:

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);

输出

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);

输出

| 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);

输出

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

想要一个逗号分隔字符串的存储过程,它是表中的一列(有 20000 行)

来自分类Dev

如何从R中另一列的子字符串中创建一列?

来自分类Dev

将一列中的字符串与另一列中的部分字符串匹配

来自分类Dev

如何用另一列中的字符串替换一列中的值?

来自分类Dev

当一列中的数字在另一列中的字符串内时,删除表行

来自分类Dev

将定界字符串中的重复值与另一列匹配并删除

来自分类Dev

如何找到子字符串值并复制到 SQL 的另一列中

来自分类Dev

从另一列中删除字符串元素

来自分类Dev

使用另一列中存在的整数截断dataframe列中的字符串

来自分类Dev

从另一列替换匹配的行字符串

来自分类Dev

在R中将一列中的字符串提取到另一列中

来自分类Dev

如何确定一列中的字符串是否在另一列中?

来自分类Dev

R:根据另一列中的值从一列中的拆分字符串中检索数据

来自分类Dev

OpenRefine-替换一列中的字符串值而不基于另一列中的值

来自分类Dev

如何检查和删除R中另一列中的字符串是否匹配

来自分类Dev

如何基于另一列中的索引来操作一列中的子字符串

来自分类Dev

熊猫数据框检查列是否包含另一列中存在的字符串

来自分类Dev

在sql中拆分字符串,并将每个分隔的值添加到表的每一列中

来自分类Dev

根据另一列中的值,用字符串替换一列中的NaN

来自分类Dev

由另一列中的数值引导的一列中的完整字符串值

来自分类Dev

根据另一列中的值,将一列中的NaN替换为字符串

来自分类Dev

将一个列表中与项目匹配的字符串部分一一替换为另一列表中的字符串部分

来自分类Dev

Excel:如何从另一列中的一列搜索子字符串

来自分类Dev

Oracle SQL,在包含来自另一列的字符串的一列中搜索字符串

来自分类Dev

检查一个列表中的任何字符串是否是另一列表中的子字符串

来自分类Dev

根据另一列中的初始字符串添加列值

来自分类Dev

使用R根据字符串是否在另一列中来更改列的值

来自分类Dev

使用r根据另一列中的值编辑字符串值

来自分类Dev

如何删除Excel另一列中的子字符串?

Related 相关文章

  1. 1

    想要一个逗号分隔字符串的存储过程,它是表中的一列(有 20000 行)

  2. 2

    如何从R中另一列的子字符串中创建一列?

  3. 3

    将一列中的字符串与另一列中的部分字符串匹配

  4. 4

    如何用另一列中的字符串替换一列中的值?

  5. 5

    当一列中的数字在另一列中的字符串内时,删除表行

  6. 6

    将定界字符串中的重复值与另一列匹配并删除

  7. 7

    如何找到子字符串值并复制到 SQL 的另一列中

  8. 8

    从另一列中删除字符串元素

  9. 9

    使用另一列中存在的整数截断dataframe列中的字符串

  10. 10

    从另一列替换匹配的行字符串

  11. 11

    在R中将一列中的字符串提取到另一列中

  12. 12

    如何确定一列中的字符串是否在另一列中?

  13. 13

    R:根据另一列中的值从一列中的拆分字符串中检索数据

  14. 14

    OpenRefine-替换一列中的字符串值而不基于另一列中的值

  15. 15

    如何检查和删除R中另一列中的字符串是否匹配

  16. 16

    如何基于另一列中的索引来操作一列中的子字符串

  17. 17

    熊猫数据框检查列是否包含另一列中存在的字符串

  18. 18

    在sql中拆分字符串,并将每个分隔的值添加到表的每一列中

  19. 19

    根据另一列中的值,用字符串替换一列中的NaN

  20. 20

    由另一列中的数值引导的一列中的完整字符串值

  21. 21

    根据另一列中的值,将一列中的NaN替换为字符串

  22. 22

    将一个列表中与项目匹配的字符串部分一一替换为另一列表中的字符串部分

  23. 23

    Excel:如何从另一列中的一列搜索子字符串

  24. 24

    Oracle SQL,在包含来自另一列的字符串的一列中搜索字符串

  25. 25

    检查一个列表中的任何字符串是否是另一列表中的子字符串

  26. 26

    根据另一列中的初始字符串添加列值

  27. 27

    使用R根据字符串是否在另一列中来更改列的值

  28. 28

    使用r根据另一列中的值编辑字符串值

  29. 29

    如何删除Excel另一列中的子字符串?

热门标签

归档