powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Поиск в случайном порядке
14 сообщений из 14, страница 1 из 1
Поиск в случайном порядке
    #39139773
ldar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.
Подскажите советом, необходимо искать в таблице слова, в каждой строке одно слово, в итоге получать id, но выдача должна быть рандомная и в количестве 5 штук. Чтоб при одном и том же поисковом запросе, выдавало разные id.
Таблица имеет такой вид
id | value
1 | Бордовый
2 | Серый

Запрос делаю таким

Код: sql
1.
SELECT t0.id, t0.value  FROM param t0  WHERE MATCH(t0.value) AGAINST ("txt" IN BOOLEAN MODE)  LIMIT 5


Он выдает постоянно одни и те же результаты,
делаю так
Код: sql
1.
SELECT t0.id, t0.value  FROM param t0  WHERE MATCH(t0.value) AGAINST ("txt" IN BOOLEAN MODE) ORDER BY RAND()  LIMIT 5


Выдает ерунду

Надеюсь понятно объяснил
...
Рейтинг: 0 / 0
Поиск в случайном порядке
    #39139782
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ldarВыдает ерунду

Надеюсь понятно объяснил
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
mysql> SELECT t0.id, t0.value
    -> FROM param t0
    -> WHERE MATCH(t0.value) AGAINST ("txt" IN BOOLEAN MODE)
    -> ORDER BY RAND()
    -> LIMIT 5;

ERROR 65535 (65535): ерунда       |

mysql>


Вот так?
...
Рейтинг: 0 / 0
Поиск в случайном порядке
    #39139796
ldar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaldarВыдает ерунду

Надеюсь понятно объяснил
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
mysql> SELECT t0.id, t0.value
    -> FROM param t0
    -> WHERE MATCH(t0.value) AGAINST ("txt" IN BOOLEAN MODE)
    -> ORDER BY RAND()
    -> LIMIT 5;

ERROR 65535 (65535): ерунда       |

mysql>


Вот так?

Упс, этот запрос отрабатывает ...Тогда сознаюсь, в действительности таблица немного другая, здесь я ее упростил думал что проблема именно в этом.

Вот как на самом деле


необходим вытаскивать товар, который попадает по 3 типам, к примеру
type=1 value= Синий
type=2 value= Женский
type=3 value= Зима
на выходе получить id_item


вот запрос, который правильно отрабатывает
Код: sql
1.
2.
SELECT t0.offer_id, t0.value  FROM param t0  GROUP BY t0.offer_id  HAVING COUNT(t0.id)=3 AND
                        MATCH(t0.value) AGAINST ("Синий Женский Зима" IN BOOLEAN MODE) LIMIT 5



Делаю так

Код: sql
1.
2.
SELECT t0.offer_id, t0.value  FROM param t0  GROUP BY t0.offer_id  HAVING COUNT(t0.id)=3 AND
                        MATCH(t0.value) AGAINST ("Синий Женский Зима" IN BOOLEAN MODE) ORDER BY RAND() LIMIT 5



выдает ерунду.
...
Рейтинг: 0 / 0
Поиск в случайном порядке
    #39139800
ldar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
offer_id в запросе, это id_item в таблице, поторопился....
...
Рейтинг: 0 / 0
Поиск в случайном порядке
    #39139817
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
250 сообщений, и всё никак не можешь понять, что выражения типа "выдаёт ерунду" следует оставить для посиделок с пивком на скамейке, а на форуме точно цитировать текст ошибки?
...
Рейтинг: 0 / 0
Поиск в случайном порядке
    #39139821
ldar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina250 сообщений, и всё никак не можешь понять, что выражения типа "выдаёт ерунду" следует оставить для посиделок с пивком на скамейке, а на форуме точно цитировать текст ошибки?

Извиняюсь, выдает результат не тот который я хочу

Вот запрос который сейчас работает
Код: sql
1.
2.
SELECT t0.offer_id, t0.value  FROM param t0  GROUP BY t0.offer_id  HAVING COUNT(t0.id)=3 AND
                        MATCH(t0.value) AGAINST ("Бордовый Женский seas_none" IN BOOLEAN MODE)  LIMIT 5


Выдает

"offer_id" "value""115397" "Бордовый""115856" "Бордовый""116042" "Бордовый""117310" "Бордовый""118461" "Бордовый"

Вот с рандомом, который выдает "ерунду"

Код: sql
1.
2.
SELECT t0.offer_id, t0.value  FROM param t0  GROUP BY t0.offer_id  HAVING COUNT(t0.id)=3 AND
                        MATCH(t0.value) AGAINST ("Бордовый Женский seas_none" IN BOOLEAN MODE) ORDER BY RAND() LIMIT 5



Результат

"offer_id" "value""143315" "Сине-Зеленый""135338" "Персиковый""134536" "Серый""126127" "Черный""155139" "Песочный"
...
Рейтинг: 0 / 0
Поиск в случайном порядке
    #39139828
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и правильно выдаёт. Хотя бы потому, что MATCH..AGAINST должен быть в секции WHERE, а не в секции HAVING...
...
Рейтинг: 0 / 0
Поиск в случайном порядке
    #39139842
ldar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaНу и правильно выдаёт. Хотя бы потому, что MATCH..AGAINST должен быть в секции WHERE, а не в секции HAVING...
написал вот такой запрос

Код: sql
1.
SELECT t0.offer_id, t0.value  FROM param t0 WHERE MATCH(t0.value) AGAINST ("Бордовый Женский seas_none" IN BOOLEAN MODE) GROUP BY t0.offer_id HAVING COUNT(t0.id)=3 ORDER BY RAND()  LIMIT 5


Запрос стал медленным, 2 сек

Explain
id ; select_type ; table ; type ; possible_keys ; key ; key_len ; ref ; rows ; Extra 1 ; SIMPLE ; t0 ; fulltext ; offer_id value_text ; value_text ; 0 ;\N; 1 ; Using where; Using temporary; Using filesort
...
Рейтинг: 0 / 0
Поиск в случайном порядке
    #39139861
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ldarЗапрос стал медленным, 2 сек
Результат стал правильным?
...
Рейтинг: 0 / 0
Поиск в случайном порядке
    #39139864
ldar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AkinaldarЗапрос стал медленным, 2 сек
Результат стал правильным?
Да, правильным. А как лучше ускорить его?
...
Рейтинг: 0 / 0
Поиск в случайном порядке
    #39139872
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ldarкак лучше ускорить его?
Ну для начала, наверное, заменить полнотекст на прямой отбор. И создать индекс, который позволит выполнять фильтрацию и группировку по индексу.
А дальше, после группировки, уже оптимизировать собсно нечего. Using temporary; Using filesort неизбежны.
...
Рейтинг: 0 / 0
Поиск в случайном порядке
    #39139969
ldar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akinaldarкак лучше ускорить его?
Ну для начала, наверное, заменить полнотекст на прямой отбор. И создать индекс, который позволит выполнять фильтрацию и группировку по индексу.
А дальше, после группировки, уже оптимизировать собсно нечего. Using temporary; Using filesort неизбежны.
Прямой отбор да, улучшил результат, но мне все таки нужно будет использовать полнотекст т.к. текст может содержаться в разных регистрах, как в базе так и в запросе. Эта база досталась мне от прошлого программиста.
Насчет индексов, у меня стоит индекс на каждое поле и explain показал, что их использует.
А как можно здесь использовать temporary, что в нем хранить?
...
Рейтинг: 0 / 0
Поиск в случайном порядке
    #39139975
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ldarмне все таки нужно будет использовать полнотекст т.к. текст может содержаться в разных регистрах, как в базе так и в запросе
А, может, разумнее почитать мануал на предмет того, за каким хреном существует слово Collation?

ldarу меня стоит индекс на каждое поле и explain показал, что их использует.
Не "их", а "один из них". Ибо несколько индексов одновременно (пока) MySQL использовать вроде как не научился. Так что надо не дохрена по отдельности индексированных полей, а один составной индекс по делу.
...
Рейтинг: 0 / 0
Поиск в случайном порядке
    #39139982
ldar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Akina,
Благодарю, Вы мне очень помогли,
время сократилось с 2сек до 0,124 сек
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Поиск в случайном порядке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]