我有一张桌子
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%'
我没有得到结果。
即使我在数据库中搜索相反的顺序,我也必须显示详细信息。
我该怎么做?
答案 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关系。