







|
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,
версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
41104
|
|