具有多个值的列

时间:2013-04-12 14:28:26

标签: sql mysqli

我有一个名为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%'

有任何建议吗?

4 个答案:

答案 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%'应该