Надо простейшую вещь сделать, но я что-то никак не пойму как. У меня есть таблица с двумя полями user,text. Мне надо выбрать N разных текстов, включающих заданное слово, так чтобы все тексты были разные и все были от разных пользователей. Пока что я дошел до
select distinct text from table where text like '% word %' group by user limit N;
но это работает не совсем верно (может не найти решение, если строки неудачно расположены), а главное ужасно медленно.
select distinct text from table where text like '% word %' group by user limit N;
но это работает не совсем верно (может не найти решение, если строки неудачно расположены), а главное ужасно медленно.
Робко..
Date: 2008-01-10 06:46 pm (UTC)Медленно работает, вероятно, потому, что поиск идет по текстовому полю. И к тому же оператор like - не самый быстрый. Может лучше будет работать MATCH() AGAINST? (посмотри http://dev.mysql.com/doc/refman/5.0/en/fulltext-natural-language.html )
Если еще чего надумаю - скажу
Re: Робко..
Date: 2008-01-10 08:29 pm (UTC)SELECT DISTINCT user, text ...
без всякого GROUP
А GROUP вообще срабатывате до DISTINCT и берет первую подходящую строку.
Re: Робко..
Date: 2008-01-11 09:28 am (UTC)умные люди говорят, что сделать что-нибудь тяжело. Вот если бы у тебя все юзеры и все тексты были заданы id и были бы проиндексированы.. :)
Да, так вот люди говорят, что, как не удивительно, может быть быстрее будет работать с вложенным подзапросом - внутренний запрос выбирает все тексты, содержащие слово, а внешний запрос уже из этих текстов выбирает уникальные. А еще лучше, если бы можно было результаты внутреннего запроса скинуть в temporary table и проиндексировать ее хотя бы по юзерам. А потом уже к ней обращаться..