Count specifieke waarde in een array.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Snelle Jaap

Snelle Jaap

01/08/2017 12:44:29
Quote Anchor link
Ik heb een aantal categorieen waar producten onder vallen. Die categorienamen loop ik in een lijstje en ik wil graag naast elke naam laten zien hoeveel producten er onder die categorie vallen.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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;
?>


Met dit als resultaat:

Afbeelding

De laatste categorie heeft twee producten onder zich maar laat alsnog 1 zien, hoe komt dat?
 
PHP hulp

PHP hulp

28/03/2024 14:49:33
 
Gerhard l

gerhard l

01/08/2017 13:05:12
Quote Anchor link
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.
 
Snelle Jaap

Snelle Jaap

01/08/2017 13:52:29
Quote Anchor link
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.


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)"
 
Thomas van den Heuvel

Thomas van den Heuvel

01/08/2017 14:08:50
Quote Anchor link
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?
 
Snelle Jaap

Snelle Jaap

01/08/2017 14:42:15
Quote Anchor link
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?

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.
 
Ivo P

Ivo P

01/08/2017 15:13:51
Quote Anchor link
kan toch ook in 1 query?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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


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
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.