SQL count + round()

Tags:    php sql mysql

<< < 12 > >>
Hej Udviklere!

Jeg har mit lille script her, som tæller antal rows i min database - jeg har leget lidt med ROUND(), men er lidt i tvivl om det kan bruges her!

Fold kodeboks ind/udPHP kode 


Når jeg echo'er $totalPictures, får jeg det eksakte antal rows i databasen - p.t. 625. Hvis jeg nu gerne vil runde op eller ned - i mit nuværnede tilfælde til 600, hvad kræves der så for dette?

På forhånd mange tak!
God weekend, og pas godt på jer selv :-)

Mvh,
Rai.



16 svar postet i denne tråd vises herunder
4 indlæg har modtaget i alt 18 karma
Sorter efter stemmer Sorter efter dato
Kristian - hvis vi skal være pernitne omkring - så ville jeg undlade COUNT på et wildcard, da MySQL tæller på alle kolonner i et datasæt. ;) Begræns det til en enkelt kolonne...

Nu er 600 rækker ikke noget at snakke om for en SQL database, ligeledes er der heller ikke de store performance problemer i at tælle rækkerne med PHP.

Dog ville den optimale SQL se ud som flg:
"SELECT ROUND(COUNT(id) / 100) * 100 AS cnt FROM pictures WHERE godkendt = 1"

så frem at primær nøgle hedder id og datasættet ikke skal bruges på anden vis...

ellers burde flg også kunne bruges:

"SELECT ROUND(COUNT(1), -2) AS cnt FROM pictures WHERE godkendt = 1"





Indlæg senest redigeret d. 30.10.2011 12:07 af Bruger #10216
Nu er det ikke nødvendigt at starte en diskussion om hvor vidt den ene udvikler er lidt mere høj i hatten end den anden, så lader vi den ligge her. :)
Det er dog satme svært at gøre noget rigtigt første gang, når man endnu skal lære af det.

@Rai
Fold kodeboks ind/udKode 




Indlæg senest redigeret d. 31.10.2011 09:12 af Bruger #10216
Du bør måske lige overveje, hvad du rent faktisk foretager dig her. Du henter 600 rækker fra MySQL til PHP, udelukkende for at tælle dem. Det er et enormt ressourcespild. Du bør i stedet får MySQL til at tælle (og afrunde) for dig.

Fold kodeboks ind/udKode 




Husk selv at analysere koden... :)

mysql_num_rows() er blevet ændret til mysql_fetch_assoc()



Det er blot at benytte simpel matematik :)

Afrunding til nærmeste 100:

round(625 / 100) * 100 = 600

Afrunding til nærmeste 50:

round(625 / 50) * 50 = 650



Indlæg senest redigeret d. 29.10.2011 00:36 af Bruger #10216
Du bør måske lige overveje, hvad du rent faktisk foretager dig her. Du henter 600 rækker fra MySQL til PHP, udelukkende for at tælle dem. Det er et enormt ressourcespild. Du bør i stedet får MySQL til at tælle (og afrunde) for dig.

Fold kodeboks ind/udKode 


nu fetcher han ik data nogen steder, men ja tæl med mysql og round med php som Michael beskriver det :)



Kenneth: nu fetcher han ik data nogen steder, men ja tæl med mysql og round med php som Michael beskriver det


Jeg tror du misforstår, hvordan datakommunikationen foregår her. Når en forespørgsel udføres, bliver resultat heraf overført til PHP. Dvs. rækkerne ligger i Rais tilfælde i $result-variablen. Hvis du med fetch mener, at du ikke udfører mysql_fetch_array()$result, så er det komplet irrelevant. Den metode henter blot én række fra resultsættet og flytter den interne pointer i $result.

Så jo - dataen bliver overført fra PHP.



Kenneth: nu fetcher han ik data nogen steder, men ja tæl med mysql og round med php som Michael beskriver det


Jeg tror du misforstår, hvordan datakommunikationen foregår her. Når en forespørgsel udføres, bliver resultat heraf overført til PHP. Dvs. rækkerne ligger i Rais tilfælde i $result-variablen. Hvis du med fetch mener, at du ikke udfører mysql_fetch_array()$result, så er det komplet irrelevant. Den metode henter blot én række fra resultsættet og flytter den interne pointer i $result.

Så jo - dataen bliver overført fra PHP.


kan godt være jeg har misforstået det, jeg har den overbevisning at mysql_query får et handel retur fra mysql.. (resources)

men ingen tvivl om det er "ressourcespild" at at bruge wildcards i querys + hente noget ud man ik har behov for, så som 600 rows.




Kenneth: Det ville jo ikke praktisk kunne fungere sådan, hvis du overvejer, hvordan det ville forholde sig i forhold til dirty reads, commits og concurrency generelt. Hvad ville idéen desuden så overhovedet være i prepared statements og at gruppere queries, hvis der alligevel for hver række blot bliver lav ét udtræk? Nej. Al dataen bliver hentet med det samme man udfører en query. :-)

Hvis du er i tvivl kan du jo evt. prøve at oprette forbinde til databasen, lave et udtræk, lukke forbindelsen til databasen og opdage, at du stadig kan tilgå den resource du fik tillbage.



Brug count(1) :)



<< < 12 > >>
t