Num_rows udput?

Tags:    php mysqli

Hej :)

Jeg vil gerne hente hvor mange kolloner, der er i min enkelte tabel, men jeg får et udput på 1, selvom der er 6.

Kode:
Fold kodeboks ind/udKode 


Som sagt giver echo $num_rows 1, hvad gør jeg forkert, selvom jeg ved at der er 6?

På forhånd tak for hjælpen :)




Indlæg senest redigeret d. 20.03.2012 11:50 af Bruger #15747
9 svar postet i denne tråd vises herunder
2 indlæg har modtaget i alt 14 karma
Sorter efter stemmer Sorter efter dato
Du laver en select count(*) som returnerer antallet i topics og det giver kun en enkelt row.

Enig.

Prøv med select * from topics i stedet for

Uenig. Flyt ikke mere data mellem database og applikation end nødvendigt. Hvis mysql kan tælle antallet for dig, så hold dig til det.

Noget i den her dur:
Fold kodeboks ind/udPHP kode 





Du laver en select count(*) som returnerer antallet i topics og det giver kun en enkelt row.

Prøv med select * from topics i stedet for



Tak :)



Uenig. Flyt ikke mere data mellem database og applikation end nødvendigt.


Enig, men nu var der jo defineret en count(*) i forvejen ;-)





Du laver en select count(*) som returnerer antallet i topics og det giver kun en enkelt row.

Enig.

Prøv med select * from topics i stedet for

Uenig. Flyt ikke mere data mellem database og applikation end nødvendigt. Hvis mysql kan tælle antallet for dig, så hold dig til det.

Noget i den her dur:
Fold kodeboks ind/udPHP kode 



Husk: Brug ikke mere data end nødvendigt.

Fold kodeboks ind/udPHP kode 


:)

Blot en sprog fejl, COUNT sender antal rækker, ikke kolonner.

Skal du have antallet af kolonner kan du bruge SHOW COLUMNS topics og derefter tælle antallet med PHP.




Husk: Brug ikke mere data end nødvendigt.

Fold kodeboks ind/udPHP kode 



Nu går jeg lidt off topic her. Rent praktisk, så tror jeg at count(*) eller count(1) er mere performancevenligt end count(col). Count(col) tæller antallet af rækker hvor col ikke er NULL. Muligvis gør det en forskel, hvis feltet er sat til ikke at kunne være null, eller der er lavet en indeksering.

Lidt omskrevet, ser jeg de 2 varianter sådan her for mig:

SELECT COUNT(*) FROM topics
SELECT COUNT(*) FROM topics WHERE id IS NOT NULL




hehe... lidt offtopic skal der vel også være plads til. :)


COUNT(*) checker alle kolonner, regner n+1 hvor * != NULL.
COUNT(id) checker kolonnen "id", og regner n+1 hvor id != NULL.
COUNT(1) checker ikke kolonner, men regner n+1 hvor 1 != NULL.


Antag:
SELECT COUNT( * != NULL ) FROM topics WHERE id IS NOT NULL
Denne SQL giver lidt en dobbelt konfekt: Find alle rækker hvor id != NULL, tæl n+1 hvor en eller flere kolonner != NULL.

Men du har ret i at COUNT(1) er mere performance venligt, da den ikke checker kolonners værdi.

Test evt. selv:
SELECT COUNT(1) FROM tbl_name
SELECT COUNT(NULL) FROM tbl_name



Jeg er ikke helt overbevist. Jeg antager det her udfra et MySQL synspunkt, og har ingen anelse om der er afvigelser i måden COUNT() er implementeret i andre DBMS'er.

Jeg går ud fra, at vi er enige i denne definition:
count(udtryk) = tæller antal rækker, hvor udtrykket ikke er NULL

Her er så hvor vi deler vandene. Hvilken slags wildcard er *?

Du mener det er:

COUNT(*) checker alle kolonner, regner n+1 hvor * != NULL.


Jeg har lige afprøvet følgende, hvilket modsiger det:
Fold kodeboks ind/udSQL kode 


MySQLs opslagsværk definere count(*) som en særlig funktion:
http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_count


COUNT(*) is somewhat different in that it returns a count of the number of rows retrieved, whether or not they contain NULL values.

COUNT(*) is optimized to return very quickly if the SELECT retrieves from one table, no other columns are retrieved, and there is no WHERE clause




Indlæg senest redigeret d. 20.03.2012 15:34 af Bruger #955
Kan forstå at jeg er blevet fejlinformeret i sin tid omkring wildcard checket

Dog er deres "COUNT(*) is optimized to return very quickly" enormt relativ. Da hastigheden af count statistik tabeller (1+ million rækker) forøges markant ved at bruge COUNT(1) eller COUNT(id) i InnoDB tabeller.

Om forklaring skal findes i den efterfølgende sætning:
This optimization applies only to MyISAM tables only, because an exact row count is stored for this storage engine and can be accessed very quickly.


Det er nok noget der må ligge i det uvisse.



t