0

我有一张名为 Employee 的表,其中包含以下信息,例如

ID      Name       Skills   

1       xyz        java,php,dotnet

2       abc        ruby,java,python

技能列保存逗号分隔的值。它可能是一个或多个。

我想设计一个基于ORoperate的查询。当用户搜索java时,数据库显示两个员工喜欢xyz,abc。

我试过这个查询,但没有结果:

SELECT m 
FROM Employee m 
Where m.Skills LIKE '%JAVA% MS PAINT%'

有什么建议吗?

4

4 回答 4

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'
于 2013-04-12T14:38:34.580 回答
1

使用不好的解决方案。全扫描和慢查询。使用技能目录创建新表。创建表 user_skills

于 2013-04-12T14:38:57.657 回答
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'
于 2013-04-12T14:41:33.313 回答
-1

select name from table where skill like '%java%'应该做

于 2013-04-12T14:30:57.933 回答