count in php komt met een verkeerd resultaat

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Daniel van Seggelen

Daniel van Seggelen

14/11/2019 11:51:32
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
    $sql = mysqli_query($DBD->conn(),"SELECT count(id) as total FROM producten WHERE merk = 'Sony' ");
    $row = mysqli_fetch_array($sql);
    
    $count = $row['total'];


Dit werkt meestal wel met andere queries waarbij de count wel goed is,maar in dit geval, telt hij 23 miloen, terwijl het resultaat rond de 4000 is.

Het punt is, dat het in phpmyadmin wel de juiste resultaat geeft.

Als ik mysqli_num_rows gebruik, dan overschrijd mijn memory limit, omdat dit om een table van 11 miljoen rijen gaat in een innoDB.

Heeft iemand een idee, hoe ik zo snel mogelijk de juiste resultaat krijg?

Alvast bedankt!
 
PHP hulp

PHP hulp

12/10/2024 13:56:57
 
- Ariën  -
Beheerder

- Ariën -

14/11/2019 12:00:51
Quote Anchor link
Hij telt 23 miljoen terwijl je dus maximaal 11 miljoen rijen hebt?
Heb je de query al in de commandline gegooid? Wat komt daar dan uit?
 
Ozzie PHP

Ozzie PHP

14/11/2019 12:26:50
Quote Anchor link
Zit je wel verbonden met de juiste database? (bijv. live-db versus test-db)
 
Daniel van Seggelen

Daniel van Seggelen

14/11/2019 13:21:19
Quote Anchor link
Jazeker, met de juiste database, daarom, vind ik het ook zo vreemd, hij komt terug met meer dan het totaal aantal rows in de betreffende tabel.

in phpmyadmin, danwel CLI, krijg ik de juiste data terug. Kan het zo zijn, dat de tabel te groot is en dan in de war raakt? Want dat lijkt het geval wel.

Dus een bug, HAHAHAHAH

Toevoeging op 14/11/2019 13:26:35:

Als ik nu net gewoon in PHPmyadmin de query laad:

SELECT count(*) as total FROM `prijzen` geeft hij zelfs in mhp en CLI nu als total 23 miljoen.

Maar het totaal is:

Weergave van records 0 - 24 (11183380 totaal,

Wat is er fout aan de count(*) of count (id) zelfde verhaal??? id is een primary key

Toevoeging op 14/11/2019 13:41:53:

Als ik dit doe

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
  $sql= "SELECT count(*) from prijzen";
 $result=mysqli_query($DBD->conn(),$sql);
$row=mysqli_fetch_array($result);
$count = $row[0];


Dan doet hi het wel goed

Toevoeging op 14/11/2019 14:03:15:

Weer een update.

Dit werkt trouwens alleen als er een WHERE clause aan vast zit zoals hierboven, waar hij alle records pakt, dan pakt het laatste nog steeds 23 miljoen, dus fout., Maar de eerste code, pakt hij pet alle records wel de juiste aantal (11 miljoen) maar met wwn WHERE weer 23 miljoen.

Er is niet 1 wijze, waarop het goed blijft werken?
 
Bart V B

Bart V B

15/11/2019 01:25:46
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SELECT COUNT(DISTINCT id) AS total FROM producten WHERE merk = 'Sony';

Wat geeft dit als resultaat? Of:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
EXPLAIN SELECT COUNT(id) AS total FROM producten WHERE merk = 'Sony';
Gewijzigd op 15/11/2019 01:36:22 door Bart V B
 
Daniel van Seggelen

Daniel van Seggelen

15/11/2019 02:32:12
Quote Anchor link
EXPLAIN SELECT COUNT(DISTINCT id) AS total FROM producten
geeft dus 23 miljoen producten, terwijl er maar 11 miljoen (11183381 ) zijn

Quote:
1
SIMPLE
producten
range
NULL
id
4
NULL
11183381
Using index for group-by (scanning)


id is al distinct , want het is een primary key.

Ik gebruik trouwens MariaDB 10.0.17

HEt lijkt erop dat dit wel een bug is, omdat hij in de war raakt met grote aantallen. Als ik het test met tabellen die 10 rows hebben, dan heb ik dit probleem niet.
 
Bart V B

Bart V B

15/11/2019 09:03:52
Quote Anchor link
In je output van je EXPLAIN heb je 11183381 staan. Dus dat snapt ie wel.
COUNT(*) telt gewoon alle records.
COUNT(id) zou tellen alle records die NOT NULL zijn.
Count(Distinct id) zou moeten tellen die uniek zijn, zou dus alleen enkele mogen tellen.
Dus, even terug naar mijn theorie:
Als je query eens anders opbouwt,
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
EXPLAIN SELECT COUNT(merk) AS total FROM producten WHERE merk = 'Sony';

wat geeft dat?
 



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.