Intereting Posts

Получите два столбца с условием 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 с условием ИЛИ. Я хочу ниже записей:

 cv1 cv2 abc xyz --- xxx 

Я попробовал case 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

 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 

Используйте 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