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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Группировка выборки из БД 
V
    Опции темы
supercelt
Дата 1.12.2010, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 25.8.2005

Репутация: нет
Всего: 1



Здравствуйте!

Есть таблицы

Table #__sections

id    title
1    Ключевые слова
2    RSS Яндекс
3    Статьи
4    Сайт



Table #__categories

id   title                            section
1   Ключевые слова           1
2   RSS Яндекс                   2
3   Покупка авто               3
4   Автострахование        3
5   Ремонт авто                3
6   Автоновости                3
7   Автоюмор                    3
8   Автоэлектроника        3
9   Авто и закон                3
10  Автомобили                 3
11  Профилактика авто    3
12  Полезные советы        3
13  Автодизайн                 3
14  Авто и безопасность   3
15  Автодиллеры               3
16  Сайт                            4
17  Новости сайта            4

Надо что бы на экране было вот так

Ключевые слова(1)
    Ключевые слова
RSS Яндекс(1)
    RSS Яндекс
Статьи(13)
    Покупка авто
    Автострахование
    Ремонт авто
    Автоновости
    Автоюмор
    Автоэлектроника
    Авто и закон
    Автомобили
    Профилактика авто
    Полезные советы
    Автодизайн
    Авто и безопасность
    Автодиллеры
Сайт(2)
    Сайт
    Новости сайта
    
Такой вывод я сделал, написал ф-ию (Это кстати для жумлы)

Код

function getIdAllSectionWithCats(&$count){
    $db =& JFactory::getDBO();
        if($count == 0)
        $query = 'SELECT `s`.`id` AS `s_id`, `s`.`title` AS `s_title`, `c`.`id` AS `c_id`, `c`.`title` AS `c_title` FROM `#__sections` AS `s` LEFT JOIN `#__categories` AS `c` ON `s`.`id` = `c`.`section` GROUP BY `s_id`, `s_title`, `c_id`, `c_title`;';
        else
        $query = 'SELECT `s`.`id` AS `s_id`, `s`.`title` AS `s_title`, `c`.`id` AS `c_id`, `c`.`title` AS `c_title`, COUNT(`c`.`id`) AS `cnt` FROM `#__sections` AS `s` LEFT JOIN `#__categories` AS `c` ON `s`.`id` = `c`.`section` GROUP BY `s_id`, `s_title`, `c_id`, `c_title`;';
    $db->setQuery($query);
    $rows = $db->loadObjectList();
    return $rows;    
    }
    

Вывод на экран

Код

$no_repeat_section = '';
    foreach($list_sc as $listing){
        if($listing->s_title == $no_repeat_section)
        echo str_repeat('&nbsp;', 4).$listing->c_title.'<br />';
        else
        echo '<a href="'.JRoute::_(ContentHelperRoute::getSectionRoute($listing->s_id)).'"><strong>'.$listing->s_title.(isset($listing->cnt) ? '('.$listing->cnt.')' : '').'</strong></a><br />'.str_repeat('&nbsp;', 4).$listing->c_title.'<br />';
    $no_repeat_section = $listing->s_title;
    }

    
В этой ф-ии переменная $count указывает подсчитать ли количество категорий в секции. Так вот без подсчёта всё выводится ок. При подсчёте надо что бы рядом с секцией выводилось в скобках кол-во категорий и вот тут проблема.
При таком запросе 
Код

SELECT `s`.`id` AS `s_id`, `s`.`title` AS `s_title`, `c`.`id` AS `c_id`, `c`.`title` AS `c_title`, COUNT(`c`.`id`) AS `cnt` FROM `#__sections` AS `s` LEFT JOIN `#__categories` AS `c` ON `s`.`id` = `c`.`section` GROUP BY `s_id`, `s_title`, `c_id`, `c_title`;

выводится что у каждой секции внутри всего 1 категория, а в секции Статьи должно быть 13 и секции Сайт - 2 категории. Если из запроса убрать `c_title` (GROUP BY `s_id`, `s_title`, `c_id`, `c_title`), то категории становятся не видны, зато подсчёт их в секциях становится правильным. Собственно сабж

Это сообщение отредактировал(а) supercelt - 1.12.2010, 18:56
PM   Вверх
supercelt
Дата 5.12.2010, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 25.8.2005

Репутация: нет
Всего: 1



Решено. Может кому пригодится
Код

SELECT `s`.`id` AS `s_id`, `s`.`title` AS `s_title`, `c`.`id` AS `c_id`, `c`.`title` AS `c_title`, t.`cnt` FROM `#__sections` AS `s` LEFT JOIN `#__categories` AS `c` ON `s`.`id` = `c`.`section`
left join (select `section`, count(`section`) `cnt` from `#__categories` group by `section`) t on t.`section`=`c`.`section`
GROUP BY `s_id`, `s_title`, `c_id`, `c_title`;

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




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


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

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