SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 05.12.2010 03:46:59

supercelt
Участник
Зарегистрирован: 05.12.2010
Сообщений: 4

Группировка выборки из БД

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

Есть таблицы

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`), то категории становятся не видны, зато подсчёт их в секциях становится правильным. Собственно сабж

Неактивен

 

#2 05.12.2010 09:46:44

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Группировка выборки из БД

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`;

Неактивен

 

#3 05.12.2010 16:59:06

supercelt
Участник
Зарегистрирован: 05.12.2010
Сообщений: 4

Re: Группировка выборки из БД

Большое спасибо). Только один ньюанс, вконце ещё надо дописать

GROUP BY `s_id`, `s_title`, `c_id`, `c_title`;
а то в каждой секции будет выводиться по 1 категории

Неактивен

 

#4 05.12.2010 23:18:14

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Группировка выборки из БД

Вам вообще не нужен GROUP BY smile

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson