Есть ли способ подсчета LIKE результатов на строку в MySQL? - PullRequest
1 голос
/ 13 апреля 2019

У меня есть таблица MySQL jobs, например:

ID | title              | keywords
1  | UI Designer        | HTML, CSS, Photoshop
2  | Web site Designer  | PHP
3  | UI/UX Developer    | CSS, HTML, JavaScript

и у меня есть такой запрос:

SELECT * FROM jobs
WHERE title LIKE '%UX%' OR title LIKE '%UI%' OR title LIKE '%Developer%' OR keywords LIKE '%HTML%' OR keywords LIKE '%CSS%'

Я хочу отсортировать результаты по наибольшему сходству.

например, для первой строки ( ID 1 ), в строке записи есть UI и HTML и CSS. тогда число CORRECT LIKE условий будет 3 для первой строки. так же, как это вычисление, это 0 для второй строки и 5 для третьей строки.

тогда я хочу, чтобы результат был упорядочен по числу ПРАВИЛЬНО, КАК условий, например:

Results
ID | title              | keywords
3  | UI/UX Developer    | CSS, HTML, JavaScript
1  | UI Designer        | HTML, CSS, Photoshop

Тогда есть ли способ подсчитать количество сходств на строку в запросе и отсортировать результат, как я описал?

Ответы [ 2 ]

1 голос
/ 13 апреля 2019

Вы можете суммировать соответствующий результат по порядку, используя if

SELECT *

FROM jobs
WHERE title LIKE '%UX%' 
OR title LIKE '%UI%' 
OR title LIKE '%Developer%' 
OR keywords LIKE '%HTML%' 
OR keywords LIKE '%CSS%'
ORDER BY (title LIKE '%UX%'+ title LIKE '%UI%'+
       keywords LIKE '%HTML%'+ keywords LIKE '%HTML%') DESC 

, если возвращаете 1 или 0, поэтому, добавляя истинный результат, вы должны получить самые подходящие строки

0 голосов
/ 13 апреля 2019

Вы не должны хранить ключевые слова в такой строке.У вас должна быть отдельная таблица.

Если - по каким-то причинам, например, очень, очень, очень плохим проектным решениям кого-то другого, - вам приходится иметь дело с этими данными, а затем учитывать разделители.В MySQL я бы порекомендовал find_in_set() для этой цели:

SELECT j.*
FROM jobs j
WHERE title LIKE '%UX%' OR
      title LIKE '%UI%' OR
      title LIKE '%Developer%' OR
      FIND_IN_SET('HTML', REPLACE(keywords, ', ', '')) > 0 OR
      FIND_IN_SET('CSS', REPLACE(keywords, ', ', '')) > 0 
ORDER BY ( (title LIKE '%UX%') +
           (title LIKE '%UI%') +
           (title LIKE '%Developer%') +
           (FIND_IN_SET('HTML', REPLACE(keywords, ', ', '')) > 0) +
           (FIND_IN_SET('CSS', REPLACE(keywords, ', ', '')) > 0)
         ) DESC ;

Это находит точное совпадение по ключевому слову.

Вы можете упростить WHERE, но не ORDER BY, до:

WHERE title REGEXP 'UX|UI|Developer' OR
      FIND_IN_SET('HTML', REPLACE(keywords, ', ', '')) > 0 OR
      FIND_IN_SET('CSS', REPLACE(keywords, ', ', '')) > 0 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...