2014-05-20 45 views
-2

我有如下表结构:获取两列,如果条件的MySQL

cv1 cv2 cv_content1 cv_content2 
abc xyz  php,mysql  sql dotnet 
aaa xxx  java   php is my skill 

我有两个关键字,可以说,PHP和DOTNET。现在我想从上面的表t1获取记录,其中前面提到的两个关键字在列cv_content1和cv_content2中有OR条件。我想下面的记录:

cv1 cv2 
abc xyz 
--- xxx 

我试图case语句,如果还和我也有检查多少关键字匹配例如,对于结果的第一行中的记录是100%(PHP和DOTNET都是行),但第二行是50%(只有PHP匹配)。

我想下面的查询到目前为止:

SELECT ROUND(((if(LOCATE("php",cv_content1)>0,25,0) OR if(LOCATE("php",cv_content2)>0,25,0)) + if(LOCATE("dotnet",cv_content1)>0,25,0) OR if(LOCATE("dotnet",cv_content2)>0,25,0)) * 100)/50) as SkillTot,if (own_content regexp '[[:<:]]smith[[:>:]]',`own_filename`),if (kings_content regexp '[[:<:]]smith[[:>:]]' ,`kings_filename`) FROM `t1`WHERE (cv_content1 REGEXP '[[:<:]]php[[:>:]]' OR cv_content2 REGEXP '[[:<:]]php[[:>:]]' OR cv_content1 REGEXP '[[:<:]]dotnet[[:>:]]' OR cv_content2 REGEXP '[[:<:]]dotnet[[:>:]]') 

它有一个语法错误也。不明白如何使用if语句

+0

所以你试过? –

+0

您存储关键字的方式很糟糕。您将面临查询数据的问题 – asprin

+0

cv_content1和cv_content2字符串是否存在?而所有的标签只是逗号分隔的字符串?如果是这种情况,你应该改变你的数据库布局 – WizKid

回答

1
SELECT IF(FIND_IN_SET('php', cv_content1) OR FIND_IN_SET('dotnet', cv_content1), 
      cv1, NULL) AS cv1, 
     IF(FIND_IN_SET('php', cv_content2) OR FIND_IN_SET('dotnet', cv_content2), 
      cv2, NULL) AS cv2 
FROM YourTable 
HAVING cv1 IS NOT NULL OR cv2 IS NOT NULL 
+0

感谢您的回答:) –

0

使用find_in_set搜索和OR找到任何输入值。

select cv1, cv2 
    from t1 
where find_in_set('php', concat(cv_content1, ',', cv_content2)) > 0 
    or find_in_set('dotnet', concat(cv_content1, ',', cv_content2)) > 0 

编辑1

select 
    case when find_in_set('php', cv_content1) 
      or find_in_set('dotnet', cv_content1) 
     then cv1 else '---' end as cv1 
, case when find_in_set('php', cv_content2) 
      or find_in_set('dotnet', cv_content2) 
     then cv2 else '---' end as cv2 
from t1; 

演示 @MySQL Fiddle


编辑2

select 
    case when find_in_set('php', replace(cv_content1, ' ', ',')) 
      or find_in_set('dotnet', replace(cv_content1, ' ', ',')) 
     then cv1 else '---' end as cv1 
, case when find_in_set('php', replace(cv_content2, ' ', ',')) 
      or find_in_set('dotnet', replace(cv_content2, ' ', ',')) 
     then cv2 else '---' end as cv2 
from t1; 

演示 @MySQL Fiddle

+0

它会获取关键字php的cv1和cv2值,我想如果关键字不在cv_content1中,那么cv1应该为null –

+0

是的。我刚刚看到你不期待'aaa'。让我重新构建查询。 –

+0

@BharatMaheshwari:检查我更新的答案。 –