Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Помогите с запросом - случайная строка из таб (Евгений) 22/03/2012 - 10:53:30
      Re: Помогите с запросом - случайная строка из таб (Akina) 22/03/2012 - 19:31:29
      Re: Не помогло - теперь даже по 3! строки печатае (Евгений) 23/03/2012 - 18:29:00
      Re: Правильно ругается... (Akina) 24/03/2012 - 00:15:35
      Re: Решил, подсказку увидел тут: (Евгений) 28/03/2012 - 10:30:09

> Original message text:
> From: Евгений - 22/03/2012 - 10:53:30
> Subject:Помогите с запросом - случайная строка из таб
> -----------------
> Добрый день!
>
> Есть потребность выводить случайный товар из базы на морду сайта,
> ORDER by RAND() LIMIT 1 - уже тупит, нереально долго, 10-15 секунд на 200К товаров (таблица с ~ 50 разношерстными столбцами). Причём не все товары надо публиковать, поле есть такое showcase, если '1' то можно...
>
> Придумал так:
> - создаю таблицу goods_cache;
> create table goods_cache(
> goodid char(16),
> good_index int unsigned AUTO_INCREMENT,
> primary key (good_index),
> unique (goodid)
> );
> - заполняю её так:
> insert ignore into goods_cache (goodid)
> select goods.goodid from goods
> where goods.showcase = 1;
>
> это делается каждый раз при выборе "достойного" товара после установки ему showcase в '1' - это относительно нечасто
> получаю в goods код товара - последовательный номер
>
> иногда товар надо снять с продаж, в основной таблице showcase = '0', в таблице goods_cache удаляю все записи, и снова делаю insert как выше. после этого имею good_index как последовательные номера, но уже с последнего AUTO_INCREMENT до + количество записей.
> типа так:
> 1 шаг, AUTO_INCREMENT=0, от 1 до 10, всего 10 записей.
> 2 шаг, AUTO_INCREMENT=10, от 11 до 22, всего 11 записей.
> и т.д.
> Не могу и не хочу делать TRUNCATE TABLE или ALTER TABLE AUTO_INCREMENT=0 чтобы считать с нуля, это требует админских прав, а их нет и не предвидится.
>
> - теперь надо получить ID записи из кеш-таблицы и потом выбрать из основной необходимые поля. Я стронник, что Кесарю - кесарево, поэтому всё что с данными - базе.
> надо взять ID со строки с координатами типа так:
> round(min(good_index)+RAND()*(min(good_index)-min(good_index)))
> и вернуть этот ID
> Можно сделать это двумя запросами, но некрасиво.
> а запрос -
> select sc.goodid as goodid
> from goods_cache as sc
> where sc.good_index in (select round(rand()*(max(sc1.good_index)-min(sc1.good_index)))+min(sc1.good_index) from goods_cache as sc1)
>
> глючит безбожно, то 0 записей, то 2(!), я вообще не понимаю как тут 2 может получиться, причём ID вообще не рядом...
>
> подскажите, как одним запросом получить случайное goodid из такой таблицы:
>
> goodid good_index
> aaaaa 22
> bbbbb 23
> ccccc 24
> ddddd 25
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>


From: Евгений - 28/03/2012 - 10:30:09
Subject:Решил, подсказку увидел тут:
-----------------
http://www.parser.ru/forum/?id=76556

select goodid
from goods_cache
where good_index >= (SELECT floor(rand()*(max(good_index)-min(good_index)))+min(good_index) FROM `goods_cache`)
order by good_index
limit 1

выдаёт случайную строчку от min до max.

Работает на упорядоченных непрерывных good_index, типа как и было указано в конце моего первого сообщения.

Спасибо!




[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
41104



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |