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
Форумы портала PHP.SU :: Версия для печати :: Случайная выборка записи
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Случайная выборка записи

Страниц (1): [1]
 

1. Snewer - 05 Апреля, 2014 - 16:53:58 - перейти к сообщению
Здравствуйте!

Имеется следующая таблица:
----------------------------
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")

спасибо.
2. Snewer - 08 Апреля, 2014 - 18:59:44 - перейти к сообщению
Никаких идей нет? Растерялся
3. Мелкий - 08 Апреля, 2014 - 19:36:04 - перейти к сообщению
Серебряной пули для выбора случайной записи из множества нету.
4. tuareg - 08 Апреля, 2014 - 22:29:31 - перейти к сообщению
Как вариант:
1) Находить MAX,MIN значения id
2) Генерировать число в интервале MIN, MAX => randId
3) Делать запрос WHERE id>=randId LIMIT 1

Еще вариант держать столбик с непрерывным значением. Главная проблема Удаление, т.к придется делать -1 для всех значений, которые больше удаляемого.

Так на вскидку больше ничего не приходит
Сейчас еще перечитал тему. Тут временная таблица поможет. Сначала выбрали, а потом второй вариант.
Табличка будет что-то типа
id increment

Сделали таблицу, нашли MAX(increment), сгенерили число 1<=число<=MAX(increment),
сделали запрос.
Как-то так
5. VestCoastman - 08 Апреля, 2014 - 22:46:03 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT id, name FROM mytable WHERE `type`='N' AND NOT FIND_IN_SET(id, '1,2,3,4,5') ORDER BY RAND() LIMIT 1
6. Snewer - 09 Апреля, 2014 - 08:33:59 - перейти к сообщению


Не думаю, что это производительный вариант
7. tuareg - 09 Апреля, 2014 - 08:52:08 - перейти к сообщению
Snewer пишет:
Не думаю, что это производительный вариант

Правильно думаете. Улыбка
8. Snewer - 09 Апреля, 2014 - 22:43:10 - перейти к сообщению
Что же делать?

Что насчет такого варианта:

1. Считаем кол-во записей, подходящих пол условие
2. Выбираем, и ставим LIMIT %случайное число от 1 до кол-ва записей%, 1
9. LIME - 09 Апреля, 2014 - 23:01:06 - перейти к сообщению
tuareg пишет:
придется делать -1 для всех значений, которые больше удаляемого.
достаточно будет записи с максимальным значением поля порядка присвоить значение удаляемого
10. tuareg - 10 Апреля, 2014 - 09:28:01 - перейти к сообщению
LIME пишет:
достаточно будет записи с максимальным значением поля порядка присвоить значение удаляемого
Кстати, да. Об этом я не подумал. Улыбка
Я обычно этот столбик использую еще и для определения порядка вывода(сортировки)
11. LIME - 10 Апреля, 2014 - 17:49:34 - перейти к сообщению
для этого можно использовать первичный ключ
для сортировки непрерывность не обязательна
(Добавление)
Snewer при LIMIT придется "отсчитать" случайное кол-во рядов
при большой таблице и выборе записи где-то в конце получится накладненько
12. Snewer - 12 Апреля, 2014 - 12:46:53 - перейти к сообщению
Можно конкретный пример, как вы предлагаете?
13. LIME - 12 Апреля, 2014 - 16:40:49 - перейти к сообщению
ничего нового я не предложил
tuareg пишет:
Еще вариант держать столбик с непрерывным значением.
имея индексированный столбец с непрерывным значением мы можем получать случайное значение в диапазоне этого поля(на стороне php) и делать по нему выборку
14. Snewer - 12 Апреля, 2014 - 17:56:43 - перейти к сообщению
Внесу конкретику.

Имеется таблица следующего вида:


Что там может быть:
1. Удалены несколько строк (даже целые промежутки строк).
2. В принципе, около 100к записей. Максимум — 1,5кк записей

Как нужно выбрать:
1. Случайно.
2. По конкретному условию, например where value = 2
3. Возможность исключать некоторые строки, т.е. not in(5, 6, ...)

Никак не могу организовать.
15. Snewer - 19 Апреля, 2014 - 11:35:03 - перейти к сообщению
Насколько можно доверять мемкешу для хранения ид записей?

 

Powered by ExBB FM 1.0 RC1