#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
бы перейти к соответствующей таблице.