Здесь работает SQL скрипку: http://sqlfiddle.com/#!9/0b0a0/32
Начнем с двух таблиц - один для текста и один для чисел:
CREATE TABLE text (`title` varchar(29));
INSERT INTO text
(`title`)
VALUES
('cheap cars for sale'),
('house for sale'),
('cats and dogs for sale'),
('iphones and androids for sale'),
('cheap phones for sale'),
('house furniture for sale')
;
CREATE TABLE iterator (`index` int);
INSERT INTO iterator
(`index`)
VALUES
(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),(13),(14),(15),
(16),(17),(18),(19),(20),(21),(22),(23),(24),(25),(26),(27),(28),(29),(30)
;
Вторая таблица, iterator
обязательно содержит числа от 1 до N, где N больше или равна длине самой длинной строки в text
.
Затем запустите этот запрос:
select
words.word, count(*) as `count`
from
(select
substring(concat(' ', t.title, ' '), i.index+1, j.index-i.index) as word
from
text as t, iterator as i, iterator as j
where
substring(concat(' ', t.title), i.index, 1) = ' '
and substring(concat(t.title, ' '), j.index, 1) = ' '
and i.index < j.index
) AS words
where
length(words.word) > 0
and words.word not like '% %'
group by words.word
order by `count` desc, words.word asc
Есть два выбирает. Внешняя просто группирует и подсчитывает одиночные слова (слова длиной больше 0 и без пробелов). Inner one извлекает все строки, начиная с любого символа пробела и заканчивая любым другим символом пробела, поэтому строки не являются словами (несмотря на то, что они назвали этот подзапрос words
), потому что они могут содержать другие пробелы, чем начало и конец.
Результаты:
word count
for 6
sale 6
and 2
cheap 2
house 2
androids 1
cars 1
cats 1
dogs 1
furniture 1
iphones 1
phones 1
Ваш вопрос очень неоднозначный. Просьба предоставить образцы данных и желаемые результаты. –
Возможный дубликат [MySQL match() против() - порядок по релевантности и столбцу?] (Http://stackoverflow.com/questions/6259647/mysql-match-against-order-by-relevance-and-column) Неточный дубликат, но он отвечает на ваш вопрос – AgeDeO
@GordonLinoff обновлен – User