Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Случайные строки 
:(
    Опции темы
BASILIO
  Дата 9.4.2008, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Koté-CAH
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 25.2.2008

Репутация: нет
Всего: нет



Есть таблица

Код

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


Есть запрос:

Код

SELECT *
FROM tbl_v_data
WHERE p='g'


В таблице будет потом огромное количество записей, а мне надо выбрать 5 случайных из них, генирировать через ПХП по ID не выход, есть ли способ сделать это внутри sql-запроса, чтоб выдался самый обыкновенный массив с 5-ю случайными строчками?
PM   Вверх
skyboy
Дата 10.4.2008, 00:06 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 41
Всего: 260



если 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, следовательно, не используется индексы, следовательно, будет сильно тормозить на большом количестве записей. потому, коль у тебя так много записей, воспользуйся лучше первым вариантом
PM MAIL   Вверх
BASILIO
Дата 10.4.2008, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Koté-CAH
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 25.2.2008

Репутация: нет
Всего: нет



1. количество записей в таблице или количество записей которые подойдут под запрос через rows_count?

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


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

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



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

PM   Вверх
Fortop
Дата 10.4.2008, 01:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 4
Всего: 42



Генерируй случайные ID на стороне приложения, а в запрос передавай уже конкретные ID все сразу


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
BASILIO
Дата 10.4.2008, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Koté-CAH
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 25.2.2008

Репутация: нет
Всего: нет



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



Проблема в том что даааалеко не все ИД будут подходить по условия выборки
PM   Вверх
Fortop
Дата 10.4.2008, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 4
Всего: 42



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

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


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
BASILIO
Дата 10.4.2008, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Koté-CAH
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 25.2.2008

Репутация: нет
Всего: нет



Fortop, 

ну если я правельно понял лимит, то допустим 100 записей, рандомом выкидывается число 95, но в оставшихся 5-ти строчках нету не одной чтоб подходила, что тогда вернёт запрос?
PM   Вверх
Feldmarschall
Дата 10.4.2008, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 3
Всего: 32



ты неправильно понял лимит
PM   Вверх
Akina
Дата 10.4.2008, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



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


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
BASILIO
Дата 10.4.2008, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Koté-CAH
*


Профиль
Группа: Участник
Сообщений: 135
Регистрация: 25.2.2008

Репутация: нет
Всего: нет



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

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


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

 smile 
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0519 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.