喜欢运营商问题

时间:2010-05-18 07:19:31

标签: sql

我有一张桌子

select * from dom

dom table details:

id    name     skills
1     dom      c,c++

这里我想使用like operator

检索查询
select * from dom where skills like '%c,c++%'

然后我得到了理想的结果,这不是问题。

假设我想使用以下查询

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

我没有得到结果。

即使我在数据库中搜索相反的顺序,我也必须显示详细信息。

我该怎么做?

3 个答案:

答案 0 :(得分:12)

为了处理所有可能的情况(字符串的开头,字符串的结尾,2个分隔符之间),你需要低效(不能使用索引)

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

最好的答案是将您的数据库放入至少first Normal Form

单独的技能表和技能/人矩阵表可以更有效地搜索并更容易使用(例如,删除个人技能)

如果您需要一个可以带回doms中匹配 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 

答案 1 :(得分: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++'

...但您的架构将更容易管理(考虑重复的条目,更新等......正常的表单内容,目前正被您的架构侵犯)。

答案 2 :(得分:0)

您需要使用全文搜索或重新设计您的架构,方法是将技能提取到一个单独的表中,并在Skill和Dom表之间建立M:N关系。