MYSQL COUNT (*) voor elke rij

Ik heb twee tabellen in mijn database. De eerste is categorie (categorytbl)

Category
ID | Category

Tweede is voor items (itemstbl)

Items
id | ItemName | CategoryID | Date | Description

Nu moet ik COUNT (*) alle items uit categoryID selecteren en tellen, maar ik heb een probleem omdat ik een artikel in meer dan één categorie kan plaatsen

Dus als ik een lijst maak met alle categorieën, moet ik weten hoeveel items ik in elke categorie heb

categorie SUV (4 items)

Offroad (43 items)

bijvoorbeeld

I have item CAR -> i can put car into SUV, Luxury, Offroad...

Bedankt om te helpen

1
Als een item meerdere categorieën kan bevatten, dan is je datamodel ongelijk .. je modellert een 1xN-relatie, wanneer het NxN zou moeten zijn (bijvoorbeeld één item behoort tot vele categorieën, en je kunt veel items in één categorie vinden)
toegevoegd de auteur pleasedontbelong, de bron
Many-to-Many Design . Maak een itermediale tabel items_categories waar de PK de item_id en de category_id is (beide zijn ook FK), de Count-query moet zo simpel zijn als SELECTEER COUNT (*) VAN items_categories WHERE category_id = 123
toegevoegd de auteur pleasedontbelong, de bron
wat is uw suggestie dan? Omdat ik veel categorieën heb en elke categorie veel items kan bevatten en elk item meerdere categorieën kan hebben
toegevoegd de auteur user999568, de bron

3 antwoord

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
1
toegevoegd

Als u de opmerkingen adresseert, klinkt het alsof u uw gegevensmodel moet aanpassen omdat u een veel-op-veel (M-naar-N) relatie tussen items en categorieën wilt, terwijl u gegevens hebt die niet in 1NF zijn (omdat deze door komma's zijn gescheiden).

Dit kan worden bereikt met behulp van een kruistabel (ook bekend als een kruistabel: hier is een Wikipedia-voorbeeld ) .

Om het aantal categorieën voor elk item te tellen (met minimaal 1 categorie):

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

En om het aantal items voor elke categorie te tellen (met minimaal 1 artikel):

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

Als u ook items/categorieën wilt opnemen waarvoor er geen categorieën/items waren, kunt u LEFT JOIN toevoegen aan de betreffende tabel.

0
toegevoegd

Is dit waarnaar je aan het zoeken bent?

 SELECT Category, count(*) from Category as c, Items as i
 WHERE c.ID = i.CategoryID
 GROUP BY Category
 ORDER BY count DESC
0
toegevoegd
Ik heb problemen met mijn items CategoryID cos in dat veld Ik heb meer dan een categorie 1,44,22,55 gescheiden met een komma dus hoe ik alle gegevens uit dat veld heb gekregen
toegevoegd de auteur user999568, de bron