Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка из двух таблиц с ограничением 
:(
    Опции темы
capitan
Дата 2.12.2007, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот бьюсь уже целый день, может кто подскажет?
Есть две таблицы table1 и table2. 
В table1 лежат категории книг - поля id_cat | name_cat
В table2 лежат книги - поля  id_book | name_book | id_cat

Задача вывести все категории и в каждой категории рандомно 10 записей.
Кто предложит наиболее рациональный вариант?

Пока я дошёл до этого :
Код

SELECT t1.id_cat, t2.name_book 
                        FROM table1 t1 
                        INNER JOIN table2 t2 on (t2.id_cat = t1.id_cat)  
                          


Выводит все записи, а мне нужно RUNDOM() и LIMIT 10
P.S. Работаю с PostgreSQL
PM MAIL WWW ICQ   Вверх
skyboy
Дата 3.12.2007, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



чесно говоря, думал, что можно обойтись только SQL, но сходу ничего не придумал.
А вот с использованием клиентской части задача вполне решаема. 
1. Выполняем запрос. 
Код

SELECT `t1`.`id_cat`, `t2`.`name_book`
FROM `table1` `t1`
INNER JOIN `table2` `t2` on `t2`.`id_cat` = `t1`.`id_cat`
ORDER BY `t1`.`id_cat`,rand()

Естественно, он нам вернет не "первые 10 для каждой категории", а все подряд книги, но со случайной сортировкой.
2. При обработке запроса РНР, учитываем, что для каждой категории выводим не более, чем MAX_RECORDS_COUNT записей(константа красивее, чем число 10).
Код

define('MAX_RECORDS_COUNT',10);
$query= mysql_query('SELECT `t1`.`id_cat`, `t2`.`name_book` 
                                    FROM `table1` `t1` 
                                    INNER JOIN `table2` `t2` 
                                    ON `t2`.`id_cat` = t1`.`id_cat`
                                    ORDER BY `t1`.`id_cat`,rand()');
$current_id_cat= 0;
$counter= 1;
while($row= mysql_fetch_array($query, MYSQL_ASSOC)) {
 if($row['car_id'] == $current_cat_id) 
  $counter++; // очередная книжка из текущей категории
 else
  $counter= 1; // первая книжка новой категории
 if($counter == MAX_RECORDS_COUNT + 1); // если для данной категории выбрали необходимое количество записей, то ждем смены категории
 else
  print_r($row); // вывод книжки, попадающей в ограничение по количеству; выводим;
}

PM MAIL   Вверх
capitan
Дата 4.12.2007, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



skyboy,  А если в базе будет порядка 15000 книг у каждой категории? Не напряжёт ли это базу? И посещаемость будет у сайта 500 ? Пока я остановился на двух запросах. Первым выбираю категорий, а вторым рандомно по 10 записей. Но за идею спасибо.
P.s. была ещё идея с temp таблицой, которая заполняется по крону. 

Это сообщение отредактировал(а) capitan - 4.12.2007, 15:04
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




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


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

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