У меня есть таблица 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 для третьей строки.

Тогда я хочу, чтобы результат был упорядочен по количеству условий CORRECT LIKE , например:

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

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

1
Reza Amya 13 Апр 2019 в 16:56

2 ответа

Лучший ответ

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

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, поэтому, добавив истинный результат, вы должны получить наиболее подходящие строки

1
scaisEdge 13 Апр 2019 в 14:11

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

Если - по какой-то причине, например, по-настоящему, по-настоящему, по-настоящему плохому выбору дизайна, - вам придется иметь дело с этими данными, а затем принять во внимание разделители. В 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 
0
Gordon Linoff 13 Апр 2019 в 14:12