Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Случайная выборка записи
Покинул форум
Сообщений всего: 117
Дата рег-ции: Июнь 2013 Откуда: РФ, Татарстан
Помог: 1 раз(а)
Здравствуйте!
Имеется следующая таблица:
---------------------------- id | name | type
----------------------------
1 | name1 | 0
----------------------------
2 | name2 | 1
----------------------------
3 | name3 | 3
----------------------------
4 | name4 | 1
----------------------------
....
размер таблицы приличный — может быть до 1,5 миллиона строк.
Требуется случайно выбрать одну запись, которая удовлетворяет условию WHERE type = N,а так же исключить некоторые id из выборки (например, "где id не равняется 1, 5, 12, 22")
спасибо.
Snewer
Отправлено: 08 Апреля, 2014 - 18:59:44
Гость
Покинул форум
Сообщений всего: 117
Дата рег-ции: Июнь 2013 Откуда: РФ, Татарстан
Помог: 1 раз(а)
Никаких идей нет?
Мелкий
Отправлено: 08 Апреля, 2014 - 19:36:04
Активный участник
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Серебряной пули для выбора случайной записи из множества нету.
----- PostgreSQL DBA
tuareg
Отправлено: 08 Апреля, 2014 - 22:29:31
Участник
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
Как вариант:
1) Находить MAX,MIN значения id
2) Генерировать число в интервале MIN, MAX => randId
3) Делать запрос WHERE id>=randId LIMIT 1
Еще вариант держать столбик с непрерывным значением. Главная проблема Удаление, т.к придется делать -1 для всех значений, которые больше удаляемого.
Так на вскидку больше ничего не приходит
Сейчас еще перечитал тему. Тут временная таблица поможет. Сначала выбрали, а потом второй вариант.
Табличка будет что-то типа
id increment
Сделали таблицу, нашли MAX(increment), сгенерили число 1<=число<=MAX(increment),
сделали запрос.
Как-то так
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
для этого можно использовать первичный ключ
для сортировки непрерывность не обязательна (Добавление) Snewer при LIMIT придется "отсчитать" случайное кол-во рядов
при большой таблице и выборе записи где-то в конце получится накладненько
Snewer
Отправлено: 12 Апреля, 2014 - 12:46:53
Гость
Покинул форум
Сообщений всего: 117
Дата рег-ции: Июнь 2013 Откуда: РФ, Татарстан
Помог: 1 раз(а)
Можно конкретный пример, как вы предлагаете?
LIME
Отправлено: 12 Апреля, 2014 - 16:40:49
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
ничего нового я не предложил
tuareg пишет:
Еще вариант держать столбик с непрерывным значением.
имея индексированный столбец с непрерывным значением мы можем получать случайное значение в диапазоне этого поля(на стороне php) и делать по нему выборку
Snewer
Отправлено: 12 Апреля, 2014 - 17:56:43
Гость
Покинул форум
Сообщений всего: 117
Дата рег-ции: Июнь 2013 Откуда: РФ, Татарстан
Помог: 1 раз(а)
Внесу конкретику.
Имеется таблица следующего вида:
Что там может быть:
1. Удалены несколько строк (даже целые промежутки строк).
2. В принципе, около 100к записей. Максимум — 1,5кк записей
Как нужно выбрать:
1. Случайно.
2. По конкретному условию, например where value = 2
3. Возможность исключать некоторые строки, т.е. not in(5, 6, ...)
Никак не могу организовать.
Snewer
Отправлено: 19 Апреля, 2014 - 11:35:03
Гость
Покинул форум
Сообщений всего: 117
Дата рег-ции: Июнь 2013 Откуда: РФ, Татарстан
Помог: 1 раз(а)
Насколько можно доверять мемкешу для хранения ид записей?
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.