![]() |
|
Модераторы: skyboy |
![]()
|
|
| ScoDi |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 17.11.2004 Репутация: нет Всего: нет |
Как случайным образом выбрать из базы значение?
SELECT text FROM s_text WHERE category_id = 7 AND id = {Случайное число}; Точнее мне нужно сделать одним запросом выборку по двум параметрам один из них случайный второй нет. Как это можно реализовать в одном запросе? Server version: 3.23.56 Это сообщение отредактировал(а) ScoDi - 15.7.2005, 09:40 |
|||
|
||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| ScoDi |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 28 Регистрация: 17.11.2004 Репутация: нет Всего: нет |
Спасибо работает... но у меня очень большая таблица ~ 2 000 000 записей, может есть ещё какой то альтернативный способ получения случайной записи. А то этот очень медленно работает
|
|||
|
||||
| Ignat |
|
||||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 21 Всего: 73 |
Быстрее не быстрее, но альтернатива:
Срандомить число в пределах выборки (от min до max).
Если num_rows<1 Повторить. Будет выигрыш при сплошном заполнениии таблицы (без DELETE'ов или удалений было минимум). -------------------- Теперь при чем :P |
||||
|
|||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
Ignat тут есть существенный минус. Если записи удалялись и выпал ID удаленной записи?
|
|||
|
||||
| Akina |
|
||||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
Ясен пень... только по-другому
Это при условии что ID равномерно распределены в диапазоне... а то получится тот еще рандом... -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
||||
|
|||||
| Ignat |
|
||||||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 21 Всего: 73 |
Повторить
Думаю, человек может определиться с наиболее оптимальным решением, особенно если проектировал сам. Для случая когда происходит последовательное удаление устаревших записей, этот вариант может рассматриваться. С произвольным удалением этот вариант и неавтоинкрементным ид - бред. -------------------- Теперь при чем :P |
||||||
|
|||||||
| Akina |
|
|||
|
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 106 Всего: 454 |
ИМХО оптимум - перейти на 4 версию и использовать
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
| Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 21 Всего: 73 |
Да один фик. Такое же количество в выборке. Тогда уж предикат рандомить. -------------------- Теперь при чем :P |
|||
|
||||
| Mal Hack |
|
|||
![]() Мудрый... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 9926 Регистрация: 15.2.2004 Репутация: 8 Всего: 261 |
А вот если мы заранее получим кол-во записей.
Разобем их на группы по 10000. Рэндомно в скрипте выберем эту группу и сделаем ORDER BY RAND() на BETWEEN( ) из этих 10000. Т.е. как бы либо из первых 10000 по ID, ибо из вторых при дополнительной сортировке. Такой вариант не увеличит быстродействие? |
|||
|
||||
| Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 21 Всего: 73 |
Если ты посто выберешь ф-цией COUNT(), то не будешь знать ID. Если узнавать ID, то опять выбирать все записи с category_id=7. Где оптимизация? Оптимизация сводится к тому, чтобы по WHERE получить как можно меньшее количество строк. -------------------- Теперь при чем :P |
|||
|
||||
| Кащей |
|
|||
|
Unregistered |
А не проще ли выбирать случайное число не по id, по recno()?.
|
|||
|
||||
| Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 21 Всего: 73 |
Это реляционная база, здесь нет номера записи. Может есть другие идеи? -------------------- Теперь при чем :P |
|||
|
||||
| Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: нет Всего: 60 |
Может в MySQL и нет номера записи, но реляционная модель тут не причем -------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
| Ignat |
|
|||
![]() Флудератор ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4030 Регистрация: 19.4.2004 Где: غيليندزيك مدينة Репутация: 21 Всего: 73 |
Как не при чем? А целостность? -------------------- Теперь при чем :P |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | MySQL | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |