喜欢运营商问题

Dom*_*nic 0 sql

我有一张桌子

select * from dom
Run Code Online (Sandbox Code Playgroud)

dom表细节:

id    name     skills
1     dom      c,c++
Run Code Online (Sandbox Code Playgroud)

在这里,我想使用like运算符检索查询

select * from dom where skills like '%c,c++%'
Run Code Online (Sandbox Code Playgroud)

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

假设我想使用以下查询

select * from dom where skills like '%C++,C%'
Run Code Online (Sandbox Code Playgroud)

我没有得到结果.

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

我怎样才能做到这一点?

Mar*_*ith 12

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

SELECT *
FROM   dom
WHERE  CONCAT(',', skills, ',') LIKE '%,C,%'
       AND CONCAT(',', skills, ',') LIKE '%,C++,%' 
Run Code Online (Sandbox Code Playgroud)

最好的答案是将您的数据库放入至少第一个Normal Form!

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

如果你需要一个查询,将带回记录匹配谁DOMS 两个 C和C++(假设相同的模式jimmy_keen的答案),这可能是与自做加盟,以获得路口,交叉操作,或者使用其他关系划分技术

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 
Run Code Online (Sandbox Code Playgroud)