我有一个名为Employee的表,其中包含以下信息,如
ID Name Skills
1 xyz java,php,dotnet
2 abc ruby,java,python
技能列保存逗号分隔值。它可能是一个或多个。
我想设计一个基于OR
操作的查询。当用户搜索java时,数据库显示两个员工喜欢xyz,abc。
我已经尝试过这个查询,但没有结果出来:
SELECT m
FROM Employee m
Where m.Skills LIKE '%JAVA% MS PAINT%'
有任何建议吗?
答案 0 :(得分:2)
理想情况下,您不应将数据存储在以逗号分隔的列表中。您应该在员工和技能之间创建一个联接表:
CREATE TABLE employees (`e_id` int, `e_name` varchar(3));
INSERT INTO employees (`e_id`, `e_name`)
VALUES
(1, 'xyz'),
(2, 'abc');
CREATE TABLE skills (`s_id` int, `s_name` varchar(6));
INSERT INTO skills (`s_id`, `s_name`)
VALUES
(1, 'java'),
(2, 'php'),
(3, 'dotnet'),
(4, 'ruby'),
(5, 'python');
CREATE TABLE employees_skills (`e_d` int, `s_id` int);
INSERT INTO employees_skills
(`e_d`, `s_id`)
VALUES
(1, 1),
(1, 2),
(1, 3),
(2, 4),
(2, 1),
(2, 5);
然后,当您想要从表中选择时,您将使用:
select *
from employees e
inner join employees_skills es
on e.e_id = es.e_id
inner join skills s
on es.s_is = s.s_id
where s.s_name in ('java', 'ruby')
或者您可以使用OR
子句:
select *
from employees e
inner join employees_skills es
on e.e_id = es.e_id
inner join skills s
on es.s_is = s.s_id
where s.s_name = 'java'
or s.s_name = 'ruby'
答案 1 :(得分:1)
使用不好的解决方案。全扫描和慢查询。 创建包含技能目录的新表。 创建表user_skills
答案 2 :(得分:1)
您应该像这样设置表格:
Employee:
ID | Name
---+------
1 | xyz
2 | abc
Skill:
ID | Name
---+------
1 | java
2 | php
3 | dotnet
4 | ruby
5 | python
EmployeeSkills:
ID | EmployeeID | SkillID
---+------------+----------
1 | 1 | 1
2 | 1 | 2
3 | 1 | 3
4 | 2 | 4
5 | 2 | 1
6 | 2 | 5
查找具有java技能的员工的查询将如下所示
SELECT
E.Name
FROM
Employee AS E
INNER JOIN
EmployeeSkill AS ES
ON
ES.EmployeeID = E.ID
INNER JOIN
Skill AS S
ON
ES.SkillID = S.ID
WHERE
S.Name = 'java'
答案 3 :(得分:-1)
select name from table where skill like '%java%'
应该