КОЛИЧЕСТВО MYSQL (*) для каждой строки

#mysql #count

#mysql #количество

Вопрос:

У меня есть две таблицы в моей БД. Сначала category (categorytbl)

 Category
ID | Category
 

Второй — для items (itemstbl)

 Items
id | ItemName | CategoryID | Date | Description
 

Теперь мне нужно выбрать и посчитать COUNT(*) все элементы, categoryID но у меня проблема, потому что я могу поместить один элемент в несколько категорий

Итак, когда я составляю список всех категорий, мне нужно знать, сколько элементов у меня есть в каждой категории

категория SUV (4 элемента)

Offroad (43 элемента)

например

У меня есть элемент CAR -> я могу поместить автомобиль в внедорожник, люкс, внедорожник…

спасибо за помощь

Комментарии:

1. Если элемент может иметь несколько категорий, то ваша модель данных неверна.. вы моделируете отношение 1xN, когда оно должно быть NxN (например, один элемент принадлежит ко многим категориям; и вы можете найти много элементов в одной категории)

2. что вы предлагаете? Потому что у меня много категорий, и в каждой категории может быть много элементов, и каждый элемент может иметь более одной категории

3. Дизайн «многие ко многим » . Создайте промежуточную таблицу items_categories itermediary, где PK — это item_id и category_id (оба также являются FK), запрос Count должен быть таким же простым, как SELECT COUNT(*) FROM items_categories WHERE category_id=123

Ответ №1:

 SELECT c.id, c.category, count(c.id) as cat_count
FROM items i
INNER JOIN category c ON (i.category_id = c.id)
GROUP BY c.id
 

Ответ №2:

Это то, что вы ищете?

  SELECT Category, count(*) from Category as c, Items as i
 WHERE c.ID = i.CategoryID
 GROUP BY Category
 ORDER BY count DESC
 

Комментарии:

1. У меня проблема с моими элементами CategoryID, потому что в этом поле у меня есть более одной категории 1,44,22,55, разделенной запятой, так как я получил все данные из этого поля

Ответ №3:

Обращаясь к комментариям, похоже, вам нужно реорганизовать вашу модель данных, потому что вы хотите, чтобы между элементами и категориями было отношение «многие ко многим» (от M до N), тогда как у вас есть данные, которых нет в 1NF (поскольку они разделены запятыми).

Это может быть достигнуто с помощью таблицы пересечений (также известной как таблица пересечений: вот пример из Википедии).

Подсчитать количество категорий для каждого элемента (который имеет как минимум 1 категорию):

 SELECT item_id, count(*) 
FROM junction_table
GROUP BY item_id
 

И подсчитать количество элементов для каждой категории (в которой есть как минимум 1 элемент):

 SELECT category_id, count(*) 
FROM junction_table
GROUP BY category_id
 

Если вы хотите также включить элементы / категории, для которых не было категорий / элементов, вы могли LEFT JOIN бы перейти к соответствующей таблице.