Здравствуйте!
Имеется следующая таблица:
----------------------------
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")
спасибо.
1. Snewer - 05 Апреля, 2014 - 16:53:58 - перейти к сообщению
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),
сделали запрос.
Как-то так
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):
скопировать код в буфер обмена
скопировать код в буфер обмена
- SELECT id, name FROM mytable WHERE `type`='N' AND NOT FIND_IN_SET(id, '1,2,3,4,5') ORDER BY RAND() LIMIT 1