Новости
Документация
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



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





















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

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

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



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