搜索包含多个值的字段

时间:2016-12-13 18:42:38

标签: mysql sql database database-design mariadb

假设我需要在我的表格中使用一个名为skills的字段。它应该存储一个人的各种技能,例如phpjavaGolang

在数据库中存储此类数据的适当方法是什么,以便更轻松地进行技能搜索

修改1

用户可以输入他想要的任何技能,上面只是一个例子

用户可以在文本框中键入一个或多个技能,以逗号分隔

实施例

skill1,skill2,skill3 

4 个答案:

答案 0 :(得分:2)

您可能应该重新考虑您的设计方法,并将这些技能存储在名为skills的相关表格中,其中列skill_idskill_name以及skill_desc等等...然后使用一个交叉引用表,用于链接您的人员表中的person_id和来自skill_id表的skills

如果您无法执行重新设计,则可以使用包含LIKE次调用的查询:

SELECT *
FROM people
WHERE skills LIKE '%php%' 
   OR skills LIKE '%java%' 
   OR skills LIKE '%Golang%';

但这很邋..我会重新设计。使用LIKE将否定索引的任何好处。

要扩展上面的多个表,当用户键入逗号分隔技能列表时,您需要将其解析为集合/数组,检查它们是否存在于新的skills表中。如果它不存在,则插入它。然后,或者如果它确实存在,则拉出skill_id并将其插入带有person_skills_xref的{​​{1}}表中(如果该组合尚不存在)。

然后,您可以执行以下选择语句:

person_id

这将为SELECT s.skill_id, s.skill_name, s.skill_desc FROM skills s JOIN people_skills_xref ps ON s.skill_id = ps.skill_id WHERE ps.person_id = @personID; person_id人提供所有技能。

或者您可以使用以下查询选择@personID表中具有特定people的所有人:

skill_id

SELECT p.person_id, p.person_name, p.person_email FROM people p JOIN people_skills_xref ps ON ps.person_id = p.person_id WHERE ps.skill_id = @skillId; 使用skill_name

LIKE

其中SELECT p.person_id, p.person_name, p.person_email FROM people p JOIN people_skills_xref ps ON ps.person_id = p.person_id JOIN skills s ON s.skill_id = ps.skill_id WHERE s.skill_name LIKE @skillName; 将包含@skillName的搜索字符串,以匹配以'%sql'结尾的任何内容,例如sqlmysql或{{1} }}

答案 1 :(得分:1)

你应该使用3个表:

msg

表用户包含所有用户,表技能包含所有可用技能,表User_Skills包含两个表。因此,如果要向用户添加技能,则应在表User_Skill中插入值。

如果您想要检索用户的所有技能,可以使用:

- debug: msg={{ansible_mounts|map(attribute='mount')|join(', ')}}

答案 2 :(得分:1)

IMO更简单(并且易于使用,同时)的方式,您需要的是使用SET类型的唯一列。

工作原理的基本概要:

  • 字段的定义:类似skills SET('php','java','goLang',...)

  • 填充字段(一次使用一项或多项技能):UPDATE table SET skills = 'php, java'

  • 寻找特定技能:SELECT * FROM table WHERE FIND_IN_SET('java', skills) > 0

看看这个MySQL page,假设MariaDB应该提供相同的功能。

重要说明:我认为这是唯一方法,为您提供所需的强大功能,因为您在OP中没有明确说明的内容,但很可能是一个要求:给定的人可能有几种技能!

第二重要注意:OP的编辑状态

  

用户可以输入他想要的任何技能

这是SET根据需要不直接工作的唯一一点,因为必须在列定义级别注册不同的可能值(但显然可以是更新为进化) 因此,如果用户想要提及一些当前未知的技能,您必须向他提供一种方式来声明&#​​34;声称"注册此新技能,然后在定义列中注册,并实际更新用户skills字段。

答案 3 :(得分:0)

  

将这些数据存储在中的适当方法是什么?   数据库

您应该有一个名为Skills的单独表格,其中应该存在所有技能,并且还应该FOREIGN KEY引用父表PRIMARY KEY字段。

这样,在需要时,您可以使用父表JOINGROUP BY父表键字段(GROUP_CONCAT(),如果您想列出所有技能)并获得所有相关技能< / p>