Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: sql выборка с лимитом по where
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » sql выборка с лимитом по where

Страниц (1): [1]
 

1. duhon - 24 Марта, 2014 - 11:46:33 - перейти к сообщению
условно есть таблица документов c полями
id, category, name, status

нужно написать sql запрос на выборку документов по 10 из каждой категории для status ='active'.

Сделать выбор всех документов а потом удалить в каждой категории лишние записи неподходит, так в таблице очень много данных (даже count по категории зависает на пару часов).

Также могу решить эту проблему на другом языке, сделал 100 запросов (тоесть для каждой категории по запросу), а потом это все склеить. Но хотелосьбы обычным sql решить

З.Ы. mysql, innodb
оталикивался от запрса select * from document where category in (1,2,3,4,5) and status = 'active' limit 10; но лимит правильно поставить для каждой категории незнаю как
2. T1grOK - 24 Марта, 2014 - 13:50:41 - перейти к сообщению
duhon пишет:
даже count по категории зависает на пару часов

Не понял Это ж насколько должен быть слабым тазик или огромной БД, чтоб озадачиться на такое время?!

А по теме. Выбрать категории и в цикле выбрать по 10 документов из каждой.
3. Мелкий - 24 Марта, 2014 - 14:23:37 - перейти к сообщению
Не встречал пока изящных и эффективных решений таких задач.

Дёшево и сердито - объедините в union кучку запросов, они же однотипные.
4. DlTA - 24 Марта, 2014 - 15:01:34 - перейти к сообщению
duhon пишет:
даже count по категории зависает на пару часов
а можно пример этого запроса, который выполняется из phpMyAdmin?

и может подумать о переводе на MyISAM ?!
http://www[dot]opennet[dot]ru/tips/1958_[dot][dot][dot]sam_innodb[dot]shtml
5. duhon - 24 Марта, 2014 - 16:33:52 - перейти к сообщению
select count(*) from document where category = 29;
вернуло 5 милионов записей. И таких категорий около 100.
Я правда сильно преувеличил, count наверно выполняется меньше часа, просто я банально приконектился к выделенному серверу БД, сделал запрос, 10 минут ответа нету, завершаю запрос, делаю експлейн, убеждаюсь что цепляю индексы, делаю count по одной категории, жду 10 минут, результата еще нету, отконекчиваюсь, через пару часов вспомню про запрос, опять конекчусь, и о чудо 5 миллионов только в одной категории. А мне по сути надо мизер что бы залить в тестовую базу.

З.Ы. А по поводу смены/оптимизации базы/сервера это все не в моей компетенции, этим у нас занимаются админы. Просто я ждал ответ в виде for или что нибудь этакого sql-ного, чисто раде повышение скила.

З.Ы.Ы транзакционнасть нужна поэтому innodb, и имхо тормозит потому что каждую миниту транзакционно добавляються/обновляються пару документов.
6. Мелкий - 24 Марта, 2014 - 18:44:05 - перейти к сообщению
DlTA пишет:
и может подумать о переводе на MyISAM ?!

Чтобы оно крэшилось просто by design и идти в даунтайм на repair на пару суток на каждый чих?

duhon пишет:
Просто я ждал ответ в виде for или что нибудь этакого sql-ного, чисто раде повышение скила.

Смотрите stored procedure

 

Powered by ExBB FM 1.0 RC1