2010-05-18 111 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