Count specifieke waarde in een array.
Voorbeeld:
Appels (2)
Peren (5)
etc
Ik ben al een eind met de code maar om de een of andere rede laat hij altijd 1 zien, terwijl er categorieen zijn met meer producten.
Dit heb ik nu:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?PHP
// Productcategorieen
$pcat = "SELECT * FROM `snm_categories` WHERE parent_id = $pid and published = 1";
$pcatcon = $conn->query($pcat);
while ($pcat = $pcatcon->fetch_assoc()){
// Aantal producten binnen een categorie
$aantal = "SELECT DISTINCT id FROM `snm_content` WHERE catid = ".$pcat['id']." and state = 1";
$aantalcon = $conn->query($aantal);
$aantal = $aantalcon->fetch_assoc();
if(is_null($aantal)){
$totaal = 0;
}else{
$totaal = count($aantal);
}
$productcatoverzicht .= '
<li class="cat-item"><a href="&'.$pcat['alias'].'">'.$pcat['title'].'</a><span class="count">'.$totaal.'</span></li>';
}
echo $productcatoverzicht;
?>
// Productcategorieen
$pcat = "SELECT * FROM `snm_categories` WHERE parent_id = $pid and published = 1";
$pcatcon = $conn->query($pcat);
while ($pcat = $pcatcon->fetch_assoc()){
// Aantal producten binnen een categorie
$aantal = "SELECT DISTINCT id FROM `snm_content` WHERE catid = ".$pcat['id']." and state = 1";
$aantalcon = $conn->query($aantal);
$aantal = $aantalcon->fetch_assoc();
if(is_null($aantal)){
$totaal = 0;
}else{
$totaal = count($aantal);
}
$productcatoverzicht .= '
<li class="cat-item"><a href="&'.$pcat['alias'].'">'.$pcat['title'].'</a><span class="count">'.$totaal.'</span></li>';
}
echo $productcatoverzicht;
?>
Met dit als resultaat:
De laatste categorie heeft twee producten onder zich maar laat alsnog 1 zien, hoe komt dat?
Wat je zou kunnen doen is '$totaal = $aantalcon->num_rows'.
Of misschien nog beter voor performance de query omzetten naar een COUNT zie hier.
Gerhard l op 01/08/2017 13:05:12:
Omdat de fetch_assoc op regel 9 niet in een while staat zal er maar 1 row gefetched worden en in $aantal worden gezet, en deze bestaat maar uit 1 veld namelijk 'id', vandaar dat de count 1 oplevert.
Wat je zou kunnen doen is '$totaal = $aantalcon->num_rows'.
Of misschien nog beter voor performance de query omzetten naar een COUNT zie hier.
Wat je zou kunnen doen is '$totaal = $aantalcon->num_rows'.
Of misschien nog beter voor performance de query omzetten naar een COUNT zie hier.
Dankje, ik heb het inderdaad op kunnen lossen met num_rows. Ik heb geprobeerd count te gebruiken maar kreeg een SQL foutmelding: "Voor elke afgeleide tabel moet een unieke alias worden gebruikt" op deze query: "SELECT Count(*) FROM (SELECT DISTINCT id FROM `snm_content` WHERE catid = 24 and state = 1)"
Zou je niet simpelweg kunnen volstaan met:
SELECT COUNT(id) FROM `snm_content` WHERE catid = 24 and state = 1
?
Of COUNT(*) for that matter.
Vanwaar een subquery?
Thomas van den Heuvel op 01/08/2017 14:08:50:
Uh, zou een id niet altijd uniek moeten zijn (en anders zou deze anders moeten heten)? Vanwaar dit DISTINCT?
Zou je niet simpelweg kunnen volstaan met:
SELECT COUNT(id) FROM `snm_content` WHERE catid = 24 and state = 1
?
Of COUNT(*) for that matter.
Vanwaar een subquery?
Zou je niet simpelweg kunnen volstaan met:
SELECT COUNT(id) FROM `snm_content` WHERE catid = 24 and state = 1
?
Of COUNT(*) for that matter.
Vanwaar een subquery?
Ah blijkbaar kan het dus ook zo. Ik had count nog nooit gebruikt en via w3schools kwam ik bij de query in mijn antwoord hierboven. Dit werkt wel inderdaad.
Code (php)
1
2
3
4
5
2
3
4
5
SELECT cat.alias, cat.title, cat.id, SUM(con.catid=cat.id) AS totaal
FROM `snm_categories` cat
LEFT JOIN snm_content con ON con.catid = cat.id AND con.state=1
WHERE cat.parent_id = $pid
and cat.published = 1
FROM `snm_categories` cat
LEFT JOIN snm_content con ON con.catid = cat.id AND con.state=1
WHERE cat.parent_id = $pid
and cat.published = 1
of ipv de SUM() met COUNT(catid)
maar dan moet je even kijken wat hij doet als er 0 items zijn voor een zekere categorie