Я создал в своей базе данных отношения "многие ко многим".

Таблица акций:

+----+---------+-----------+------------+-----------+------------+--------------------+
| id | city    | title     | highlights | details   | conditions | url                |
+----+---------+-----------+------------+-----------+------------+--------------------+
| 1  | Toronto | Test Data | Test Data  | Test Data | Test Data  | https://google.com |
+----+---------+-----------+------------+-----------+------------+--------------------+
| 2  | Toronto | Test Data | Test Data  | Test Data | Test Data  | https://google.com |
+----+---------+-----------+------------+-----------+------------+--------------------+
| 3  | Toronto | Test Data | Test Data  | Test Data | Test Data  | https://google.com |
+----+---------+-----------+------------+-----------+------------+--------------------+
| 4  | Toronto | Test Data | Test Data  | Test Data | Test Data  | https://google.com |
+----+---------+-----------+------------+-----------+------------+--------------------+
| 5  | Toronto | Test Data | Test Data  | Test Data | Test Data  | https://google.com |
+----+---------+-----------+------------+-----------+------------+--------------------+

Таблица категорий:

+----+------------+-----------+-----------------------+------------+
| id | name       | parent_id | image_url             | sort_order |
+----+------------+-----------+-----------------------+------------+
| 1  | Category 1 | 0         | https://fakeimage.url | 0          |
+----+------------+-----------+-----------------------+------------+
| 2  | Category 2 | 0         | https://fakeimage.url | 0          |
+----+------------+-----------+-----------------------+------------+
| 3  | Category 3 | 0         | https://fakeimage.url | 0          |
+----+------------+-----------+-----------------------+------------+
| 4  | Category 4 | 0         | https://fakeimage.url | 0          |
+----+------------+-----------+-----------------------+------------+
| 5  | Category 5 | 0         | https://fakeimage.url | 0          |
+----+------------+-----------+-----------------------+------------+

Таблица Promo_cat:

+--------------+-------------+
| promotion_id | category_id |
+--------------+-------------+
| 1            | 1           |
+--------------+-------------+
| 2            | 1           |
+--------------+-------------+
| 3            | 2           |
+--------------+-------------+
| 4            | 3           |
+--------------+-------------+
| 5            | 4           |
+--------------+-------------+

Я хочу здесь подсчитать количество рекламных акций в каждой категории. Раньше у меня была category_id внутри таблицы рекламных акций, поэтому я мог получить доступ к счетчику, используя следующий запрос

SELECT
`c`.`name`,
`c`.`id`,
`c`.`image_url`,
`c`.`parent_id`,
`c`.`sort_order`,
`cat`.`name` AS `parent_category_name`,
(
SELECT
    COUNT(*)
FROM
    `promotions`
WHERE
    `promotions`.`category_id` = `c`.`id` AND `promotions`.`city` = "Toronto"
) AS COUNT
FROM
    `category` c
LEFT JOIN `category` cat ON
    `cat`.`id` = `c`.`parent_id`
GROUP BY
    `c`.`id`
ORDER BY
    COUNT

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

SELECT
    category.name,
    category.id,
    category.image_url,
    category.parent_id,
    category.sort_order,
    (
    SELECT
        COUNT(*)
    FROM
        `promotions`
    JOIN promo_cat ON promo_cat.promotion_id = promotions.id
    JOIN category ON category.id = promo_cat.category_id
    WHERE
        promo_cat.category_id = category.id AND promotions.city = "Toronto"
) AS COUNT
FROM
    promotions
JOIN promo_cat ON promo_cat.promotion_id = promotions.id
JOIN category ON category.id = promo_cat.category_id
GROUP BY
    category.id

SQL Fiddle с образцами данных и таблиц http://sqlfiddle.com/#!9/5b94228

0
Shaikh Kamran Ahmed 4 Май 2021 в 14:26

1 ответ

Лучший ответ

Нет необходимости в отдельном запросе только для подсчета. Все это можно сделать прямо в основном запросе с правильной связью между таблицами и группировкой:

SELECT category.*, COUNT(*) AS no_of_promotions
FROM category
INNER JOIN promo_cat ON promo_cat.category_id = category.id
INNER JOIN promotions ON promo_cat.promotion_id = promotions.id
GROUP BY category.id;

Я поместил таблицу category в предложение FROM (поскольку данные категории являются основой вашего выбора), а затем соединил ее с promotions с помощью таблицы поиска promo_cat, но это будет работать, даже если порядок таблиц будет обратным (выберите из рекламных акций> присоединиться к Promo_cat> присоединиться к категории).

Поскольку вы хотите наблюдать записи по категории , данные группируются по идентификатору категории. Теперь простое добавление счетчика в такой запрос вернет количество записей в группе.

1
El_Vanja 4 Май 2021 в 13:51