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 :: Случайная выборка записи

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
Snewer
Отправлено: 05 Апреля, 2014 - 16:53:58
Post Id



Гость


Покинул форум
Сообщений всего: 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")

спасибо.
 
 Top
Snewer
Отправлено: 08 Апреля, 2014 - 18:59:44
Post Id



Гость


Покинул форум
Сообщений всего: 117
Дата рег-ции: Июнь 2013  
Откуда: РФ, Татарстан


Помог: 1 раз(а)




Никаких идей нет? Растерялся
 
 Top
Мелкий Супермодератор
Отправлено: 08 Апреля, 2014 - 19:36:04
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Серебряной пули для выбора случайной записи из множества нету.


-----
PostgreSQL DBA
 
 Top
tuareg
Отправлено: 08 Апреля, 2014 - 22:29:31
Post Id


Участник


Покинул форум
Сообщений всего: 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),
сделали запрос.
Как-то так

(Отредактировано автором: 08 Апреля, 2014 - 22:35:49)

 
 Top
VestCoastman
Отправлено: 08 Апреля, 2014 - 22:46:03
Post Id



Посетитель


Покинул форум
Сообщений всего: 374
Дата рег-ции: Дек. 2010  


Помог: 3 раз(а)




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

(Отредактировано автором: 08 Апреля, 2014 - 22:47:28)

 
 Top
Snewer
Отправлено: 09 Апреля, 2014 - 08:33:59
Post Id



Гость


Покинул форум
Сообщений всего: 117
Дата рег-ции: Июнь 2013  
Откуда: РФ, Татарстан


Помог: 1 раз(а)






Не думаю, что это производительный вариант
 
 Top
tuareg
Отправлено: 09 Апреля, 2014 - 08:52:08
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




Snewer пишет:
Не думаю, что это производительный вариант

Правильно думаете. Улыбка
 
 Top
Snewer
Отправлено: 09 Апреля, 2014 - 22:43:10
Post Id



Гость


Покинул форум
Сообщений всего: 117
Дата рег-ции: Июнь 2013  
Откуда: РФ, Татарстан


Помог: 1 раз(а)




Что же делать?

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

1. Считаем кол-во записей, подходящих пол условие
2. Выбираем, и ставим LIMIT %случайное число от 1 до кол-ва записей%, 1
 
 Top
LIME
Отправлено: 09 Апреля, 2014 - 23:01:06
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




tuareg пишет:
придется делать -1 для всех значений, которые больше удаляемого.
достаточно будет записи с максимальным значением поля порядка присвоить значение удаляемого
 
 Top
tuareg
Отправлено: 10 Апреля, 2014 - 09:28:01
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




LIME пишет:
достаточно будет записи с максимальным значением поля порядка присвоить значение удаляемого
Кстати, да. Об этом я не подумал. Улыбка
Я обычно этот столбик использую еще и для определения порядка вывода(сортировки)

(Отредактировано автором: 10 Апреля, 2014 - 09:44:38)

 
 Top
LIME
Отправлено: 10 Апреля, 2014 - 17:49:34
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




для этого можно использовать первичный ключ
для сортировки непрерывность не обязательна
(Добавление)
Snewer при LIMIT придется "отсчитать" случайное кол-во рядов
при большой таблице и выборе записи где-то в конце получится накладненько
 
 Top
Snewer
Отправлено: 12 Апреля, 2014 - 12:46:53
Post Id



Гость


Покинул форум
Сообщений всего: 117
Дата рег-ции: Июнь 2013  
Откуда: РФ, Татарстан


Помог: 1 раз(а)




Можно конкретный пример, как вы предлагаете?
 
 Top
LIME
Отправлено: 12 Апреля, 2014 - 16:40:49
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




ничего нового я не предложил
tuareg пишет:
Еще вариант держать столбик с непрерывным значением.
имея индексированный столбец с непрерывным значением мы можем получать случайное значение в диапазоне этого поля(на стороне php) и делать по нему выборку
 
 Top
Snewer
Отправлено: 12 Апреля, 2014 - 17:56:43
Post Id



Гость


Покинул форум
Сообщений всего: 117
Дата рег-ции: Июнь 2013  
Откуда: РФ, Татарстан


Помог: 1 раз(а)




Внесу конкретику.

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


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

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

Никак не могу организовать.
 
 Top
Snewer
Отправлено: 19 Апреля, 2014 - 11:35:03
Post Id



Гость


Покинул форум
Сообщений всего: 117
Дата рег-ции: Июнь 2013  
Откуда: РФ, Татарстан


Помог: 1 раз(а)




Насколько можно доверять мемкешу для хранения ид записей?
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB