2010-05-18 138 views
0

我有一個DOM表像操作問題

select * from dom 

DOM表的詳細信息:

id name  skills 
1  dom  c,c++ 

在這裏,我想用類似操作

select * from dom where skills like '%c,c++%' 

然後我得到了想要檢索查詢結果,這不是問題。

假設我想用下面的查詢

select * from dom where skills like '%C++,C%' 

我沒有得到一個結果。

所以我必須顯示細節,即使我在數據庫中搜索逆序。

我該怎麼做?

回答

12

,以處理所有可能的情況下(字符串的開始,字符串的結束,2名之間的分隔符),你需要的低效(不能使用索引)

SELECT * 
FROM dom 
WHERE CONCAT(',', skills, ',') LIKE '%,C,%' 
     AND CONCAT(',', skills, ',') LIKE '%,C++,%' 

最好的答案將是把你的數據庫至少first Normal Form

一個單獨的技能表和技能/人矩陣表是更有效的搜索,更容易使用(如刪除個人技能)

工作,如果你需要一個查詢,會帶回記錄匹配誰延遲性肌肉痠痛 C和C++(假設相同的模式jimmy_keen's answer)這可能是與自我進行聯接,以獲得路口,交叉操作,或者使用other relational division techniques

SELECT d.name 
FROM dom d 
     JOIN dom_skills ds 
     ON (d.id = ds.id_dom) 
     JOIN skills s 
     ON (ds.id_skill = s.id) 
WHERE s.name IN ('C', 'C++') 
GROUP BY d.id, 
      s.id, 
      d.name 
HAVING COUNT(DISTINCT s.name) = 2 
0

您需要使用全文搜索或者通過extracti重新設計您的模式ng技能放入單獨的表中,並且在Skill和Dom表之間具有M:N關係。

2

技能列看起來像你可能想要映射與你原來的「dom」表的多對多關係的東西。例如:

SKILLS  DOM   DOM_SKILLS 
id | name id | name id_dom | id_skill 
---'----- ---'----- -------'--------- 
1 | C  1 | dom  1 | 1 
2 | C++     1 | 2 

這樣一來,您的查詢可能看起來有點複雜......

SELECT d.name, s.name 
FROM dom d 
JOIN dom_skills ds ON (d.id = ds.id_dom) 
JOIN skills s ON (ds.id_skill = s.id) 
WHERE s.name LIKE '%C%' OR s.name LIKE '%C++' 

...但你的模式會更容易管理(想想重複條目,更新等。 。正常形式的東西,這是目前違反你的架構)。

+0

+1。儘管如此,我已經去了('C','C++')中的WHERE s.name。 – 2010-05-18 07:49:47