SQL находит слова в строке, сортирует результат по количеству найденных слов - PullRequest
0 голосов
/ 29 октября 2018

У меня проблема с кодированием, и мне было интересно, есть ли реализация SQL следующего сценария:

Я хочу найти в текстовом столбце определенные слова и отсортировать результаты по количеству найденных отдельных слов. Например:

Найдем строку, которая содержит: a b s

a b b c d e s
b d s w d a s
x d s g w d s
f e h w d s a

Желаемый результат будет:

a b b c d e s (it contains all 3 words)
b d s w d a s (it contains all 3 words)
f e h w d s a (it contains 2 words)
x d s g w d s (it contains 1 word)

Рекомендуется ли делать что-то подобное, например, например, PHP или есть эффективный способ SQL сделать это?

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

Моя идея:

  1. преобразование в список отдельных слов с использованием решения: SQL-разбиение значений на несколько строк
  2. количество найденных строк для каждой исходной строки.
0 голосов
/ 29 октября 2018

Вы можете сделать это, используя логические выражения:

select t.*,
       ( (col like '%a%') +
         (col like '%b%') +
         (col like '%s%') +
       ) as num_matches
from t
order by num_matches desc;

Если слова должны быть разделены пробелами, то:

select t.*,
       ( (concat(' ', col, ' ') like '% a %') +
         (concat(' ', col, ' ') like '% b %') +
         (concat(' ', col, ' ') like '% s %') +
       ) as num_matches
from t
order by num_matches desc;

Наконец, если у вас есть проблема такого типа, то вам нужно сделать одну из двух вещей:

  • Если текст на самом деле является текстом, посмотрите на возможности полнотекстового поиска.
  • Если текст на самом деле представляет собой список чего-то вроде ключевых слов или пользователей, исправьте модель данных и используйте таблицу соединений / связей.
0 голосов
/ 29 октября 2018

Если бы это было сделано в SQL, я бы посмотрел на это с помощью полнотекстового поиска, который позволяет RANK (http://msdn.microsoft.com/en-us/library/cc879245.aspx)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...