Получение нескольких подсчетов из двух объединенных таблиц в MySQL - PullRequest
1 голос
/ 02 февраля 2012

Итак, у меня есть две таблицы, категории и конструкции. Я хочу построить запрос, который будет извлекать все категории, а также количество любых подкатегорий (category.parent_id, равных category.id) И количество любых проектов (design.category_id, равных category.id)

Если я пытаюсь получить только одно из этих значений, все работает нормально, но когда я пытаюсь использовать оба кода с помощью следующего кода, число обоих значений совпадает (и не является правильным числом) для обоих.

        $this->db->select('categories.id AS id, categories.parent_id AS parent_id, categories.title AS title, 
        categories.description AS description, categories.img_path AS img_path, COUNT(designs.id) AS design_count, 
        COUNT(sub_categories.id) as sub_category_count');
        $this->db->from('categories');
        $this->db->join('designs',                          'categories.id = designs.category_id', 'left');
        $this->db->join('categories as sub_categories',     'categories.id = sub_categories.parent_id', 'left');
        $this->db->group_by('categories.id');

Любая помощь будет высоко ценится, ура!

Ответы [ 2 ]

3 голосов
/ 02 февраля 2012

Предполагая, что корневые категории не содержат дизайнов, вот запрос, который возвращает необходимую информацию:

SELECT category.id, category.title, subcategory.id, designs.id
FROM categories category
LEFT JOIN categories subcategory ON category.id = subcategory.parent_id
LEFT JOIN designs ON subcategory.id = designs.category_id
WHERE category.parent_id IS NULL

Теперь все, что вам нужно сделать, это применить группировку:

SELECT category.id, category.title, COUNT(DISTINCT subcategory.id), COUNT(designs.id)
FROM categories category
LEFT JOIN categories subcategory ON category.id = subcategory.parent_id
LEFT JOIN designs ON subcategory.id = designs.category_id
WHERE category.parent_id IS NULL
GROUP BY category.id, category.title

Ключом здесь является использование COUNT(DISTINCT ...).

0 голосов
/ 02 февраля 2012
SELECT c.id,c.title,
       IFNULL(sc.counted,0) AS subcategories,
       IFNULL(d.counted,0) AS designs
FROM categories c 
     LEFT JOIN 
     ( SELECT parent_id,COUNT(*) AS counted 
         FROM categories GROUP BY parent_id ) sc
       ON c.id=sc.parent_id
     LEFT JOIN
     ( SELECT category_id,COUNT(*) AS counted 
         FROM designs GROUP BY category_id ) d
       ON c.id=d.category_id
WHERE c.parent_id IS NULL ;

должен получить нужные числа в виде необработанного SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...