2013-04-12 26 views
0

我已呼籲員工一個表,其中包含像列有多個值

ID  Name  Skills 

1  xyz  java,php,dotnet 

2  abc  ruby,java,python 

技能欄下面的信息保存逗號seprated值。它可能是一個或多個。

我想設計一個基於OR的查詢操作。當用戶搜索java時,數據庫顯示兩個員工喜歡xyz,abc。

我已經試過這個查詢,但沒有結果出來:

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

什麼建議嗎?

+2

請不要存儲數據的員工逗號分隔列表。您需要有一個單獨的表來將用戶與技能相關聯。 – Taryn

+0

請顯示您的代碼。僅供參考,這是一個非常差的數據庫格式。你不應該在那裏存儲逗號分隔值。 – sashkello

+0

該表的結構是什麼?以及我會寫什麼樣的查詢? – user1030128

回答

-1

select name from table where skill like '%java%'應該做

+0

但是當你嘗試php,那麼沒有結果出來.... – user1030128

+1

你需要在這裏顯示你的PHP代碼 – Satya

+0

SELECT m FROM Employee m where m.Skills LIKE'%JAVA%MS PAINT%'..沒有結果爲什麼? - – user1030128

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' 
+0

謝謝。我會根據「OR」條件寫入什麼樣的查詢來獲取數據?像Java或Ruby? – user1030128

+1

@ user1030128這是'WHERE'子句 - '其中s.s_name在('java','ruby')'。 'IN'將返回具有java或ruby技能的行。 – Taryn

1

使用像不好的解決方案。全面掃描和慢查詢。 創建具有技能目錄的新表格。 創建表user_skills

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' 
+0

Tnanks Macro..Much讚賞你的努力。它的工作原理,但我如何找到數據,如果我提供Java或Ruby?兩個員工都應該基於OR運算符... – user1030128

+0

您可以將約束更改爲'S.Name ='java'OR S.Name ='ruby''或者S.Name IN('java','ruby ')' - 不確定哪些將更快atm –

+0

使用在運營商或類似的? – user1030128