Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > Случайные строки


Автор: BASILIO 9.4.2008, 20:34
Есть таблица

Код

CREATE TABLE tbl_v_data (
id INTEGER,
p CHAR(1)
)


Есть запрос:

Код

SELECT *
FROM tbl_v_data
WHERE p='g'


В таблице будет потом огромное количество записей, а мне надо выбрать 5 случайных из них, генирировать через ПХП по ID не выход, есть ли способ сделать это внутри sql-запроса, чтоб выдался самый обыкновенный массив с 5-ю случайными строчками?

Автор: skyboy 10.4.2008, 00:06
если 5 всего, то лучше так:
1. получаем количество записей
2. пять раз делаем следующее:
 а. получить случайное число от 1 до количества записей(@number)
 б. выполнить запрос 
Код

SELECT *
FROM `tbl_v_data`
WHERE `p`= 'g'
LIMIT @number,1

есть вариант:
Код

SELECT *
FROM `tbl_v_data`
WHERE `p`= 'g'
ORDER BY rand()
LIMIT 5

но этот вариант вызывает filesort, следовательно, не используется индексы, следовательно, будет сильно тормозить на большом количестве записей. потому, коль у тебя так много записей, воспользуйся лучше первым вариантом

Автор: BASILIO 10.4.2008, 00:53
1. количество записей в таблице или количество записей которые подойдут под запрос через rows_count?

2. если чесно я привёл сжатый вариант таблицы, поправде запрос будет более грамозким в разделе WHERE иммет смысл базу 5 раз грузить такими вещами?


Цитата(skyboy @  10.4.2008,  00:06 Найти цитируемый пост)
б. выполнить запрос 
Код

SELECT *
FROM `tbl_v_data`
WHERE `p`= 'g'
LIMIT @number,1



а если строка с номмер @number не будет подходить под условия, он автоматический следущию нужную возьмёт?

Автор: Fortop 10.4.2008, 01:19
Генерируй случайные ID на стороне приложения, а в запрос передавай уже конкретные ID все сразу

Автор: BASILIO 10.4.2008, 01:38
Цитата(Fortop @  10.4.2008,  01:19 Найти цитируемый пост)
Генерируй случайные ID на стороне приложения, а в запрос передавай уже конкретные ID все сразу 



Проблема в том что даааалеко не все ИД будут подходить по условия выборки

Автор: Fortop 10.4.2008, 01:51
Тут либо шашечки, либо ехать.
Если ты хочешь случайные записи из немерянной таблицы, да еще по зубодробительному условию - то выхода у тебя другого нет.

Н запросов с случайным LIMIT, как и писал 
skyboy, 

Автор: BASILIO 10.4.2008, 17:10
Fortop, 

ну если я правельно понял лимит, то допустим 100 записей, рандомом выкидывается число 95, но в оставшихся 5-ти строчках нету не одной чтоб подходила, что тогда вернёт запрос?

Автор: Feldmarschall 10.4.2008, 17:12
ты неправильно понял лимит

Автор: Akina 10.4.2008, 17:37
Отбор подходящих по WHERE записей выполняется до применения LIMIT, так что неподходящие в выборку не попадут. Или ты неверно задаешь условия отбора.

Автор: BASILIO 10.4.2008, 17:42
Цитата(Feldmarschall @  10.4.2008,  17:12 Найти цитируемый пост)
ты неправильно понял лимит 

+
Цитата(skyboy @  10.4.2008,  00:06 Найти цитируемый пост)
1. получаем количество записей


Вытекающий вопрос, как лутче всего получить количество записей?
а. Через PHP mysql_num_rows()
б. SQL-командой

 smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)