Tu pracuje SQL Fiddle: http://sqlfiddle.com/#!9/0b0a0/32
Zacznijmy od dwóch tabel - jeden dla tekstów i jeden dla liczb:
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)
;
Drugi stół iterator
moszcz zawiera numery od 1 do N, gdzie N większa lub równa długości najdłuższego łańcucha w text
.
Następnie uruchomić tę kwerendę:
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
Istnieją dwa wybiera. Zewnętrzny po prostu grupuje i zlicza pojedyncze słowa (słowa o długości większej od 0 i bez spacji). Wewnętrzna wyodrębnia wszystkie ciągi zaczynając od dowolnego znaku spacji i kończąc na dowolnym innym znaku spacji, więc łańcuchy nie są słowami (pomimo nazwania tego podzapytania words
), ponieważ mogą zawierać inne spacje niż początkowe i końcowe.
Wyniki:
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
Twoje pytanie jest bardzo niejednoznaczne. Podaj przykładowe dane i pożądane wyniki. –
możliwy duplikat [dopasowania MySQL() względem() - kolejność według trafności i kolumny?] (Http://stackoverflow.com/questions/6259647/mysql-match-against-order-by-relevance-and-column) Nie jest to dokładny duplikat, ale odpowiada na twoje pytanie – AgeDeO
@GordonLinoff zaktualizowano – User