Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SELECT Random? 
:(
    Опции темы
ScoDi
Дата 15.7.2005, 09:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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
PM MAIL WWW   Вверх
Akina
Дата 15.7.2005, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Код

SELECT text FROM s_text WHERE category_id = 7 ORDER BY RAND() LIMIT 1;



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
ScoDi
Дата 15.7.2005, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 28
Регистрация: 17.11.2004

Репутация: нет
Всего: нет



Спасибо работает... но у меня очень большая таблица ~ 2 000 000 записей, может есть ещё какой то альтернативный способ получения случайной записи. А то этот очень медленно работает smile
PM MAIL WWW   Вверх
Ignat
Дата 15.7.2005, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Быстрее не быстрее, но альтернатива:


Код

SELECT MIN(`id`) as `min`, MAX(`id`) as `max` FROM `s_text` WHERE 1;


Срандомить число в пределах выборки (от min до max).


Код

SELECT `text` FROM `s_text` WHERE `category_id` = 7 AND `id` = {Случайное число};


Если num_rows<1 Повторить.

Будет выигрыш при сплошном заполнениии таблицы (без DELETE'ов или удалений было минимум).


--------------------
Теперь при чем :P
PM   Вверх
Mal Hack
Дата 15.7.2005, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



Ignat тут есть существенный минус. Если записи удалялись и выпал ID удаленной записи?
PM ICQ   Вверх
Akina
Дата 15.7.2005, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(ScoDi @ 15.7.2005, 11:08)
очень медленно работает

Ясен пень... только по-другому

Цитата(Ignat @ 15.7.2005, 14:44)
Срандомить число в пределах выборки (от min до max).

Это при условии что ID равномерно распределены в диапазоне... а то получится тот еще рандом...





--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ignat
Дата 15.7.2005, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Цитата(Mal @ 15.7.2005, 15:03)
Если записи удалялись и выпал ID удаленной записи?

Повторить smile
Цитата(Ignat @ 15.7.2005, 14:44)

Если num_rows<1 Повторить.



Цитата(Akina @ 15.7.2005, 15:20)
Это при условии что ID равномерно распределены в диапазоне... а то получится тот еще рандом...

smile Угу. Надо было оговориться, что для автоинкрементного id подходит.

Думаю, человек может определиться с наиболее оптимальным решением, особенно если проектировал сам. Для случая когда происходит последовательное удаление устаревших записей, этот вариант может рассматриваться. С произвольным удалением этот вариант и неавтоинкрементным ид - бред.


--------------------
Теперь при чем :P
PM   Вверх
Akina
Дата 15.7.2005, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



ИМХО оптимум - перейти на 4 версию и использовать

Код

SELECT * FROM 
   (SELECT text FROM s_text WHERE category_id = 7) 
ORDER BY RAND() LIMIT 1;



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Ignat
Дата 15.7.2005, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Цитата(Akina @ 15.7.2005, 16:27)
ИМХО оптимум - перейти на 4 версию и использовать

Да один фик. Такое же количество в выборке. Тогда уж предикат рандомить.


--------------------
Теперь при чем :P
PM   Вверх
Mal Hack
Дата 15.7.2005, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 8
Всего: 261



А вот если мы заранее получим кол-во записей.
Разобем их на группы по 10000. Рэндомно в скрипте выберем эту группу и сделаем ORDER BY RAND() на BETWEEN( ) из этих 10000. Т.е. как бы либо из первых 10000 по ID, ибо из вторых при дополнительной сортировке.

Такой вариант не увеличит быстродействие?
PM ICQ   Вверх
Ignat
Дата 15.7.2005, 15:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Цитата(Mal @ 15.7.2005, 16:42)
Такой вариант не увеличит быстродействие?

Если ты посто выберешь ф-цией COUNT(), то не будешь знать ID. Если узнавать ID, то опять выбирать все записи с category_id=7. Где оптимизация?

Оптимизация сводится к тому, чтобы по WHERE получить как можно меньшее количество строк.


--------------------
Теперь при чем :P
PM   Вверх
Кащей
Дата 15.7.2005, 17:23 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











А не проще ли выбирать случайное число не по id, по recno()?.
  Вверх
Ignat
Дата 15.7.2005, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Цитата
recno()

Это реляционная база, здесь нет номера записи. Может есть другие идеи?


--------------------
Теперь при чем :P
PM   Вверх
Cashey
Дата 15.7.2005, 19:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: нет
Всего: 60



Цитата(Ignat @ 15.7.2005, 17:32)
Это реляционная база, здесь нет номера записи. Может есть другие идеи?

Может в MySQL и нет номера записи, но реляционная модель тут не причем smile. Тогда id должен быть динамически изменяемым, т.е. после каждого удаления записи пересчитыватся по все базе. Вероятно, будет занимать кучу времени, зато не будет "дырок"


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Ignat
Дата 15.7.2005, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

Репутация: 21
Всего: 73



Цитата(Cashey @ 15.7.2005, 20:17)
Может в MySQL и нет номера записи, но реляционная модель тут не причем

Как не при чем? А целостность?


--------------------
Теперь при чем :P
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0698 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.