10. september 2012 - 11:06Der er
17 kommentarer og 1 løsning
Tælle antal poster med samme værdi via PHP
Hej
Jeg har en MySQL tabel hvor jeg gerne vil tælle antallet af poster med samme værdi, f.eks. for at se hvor mange gange den samme værdi fremkommer i et bestemt felt i en tabel hvor dubletter er tilladt.
Og hvis der er over et vist antal forekomster af samme værdi, så vil jeg trække værdien og antallet af forekomster ud af tabellen og printe den på en oversigt.
Er der nogen der ved hvordan jeg laver det i PPH (vers. 4)?
Mød en af Nordens fremmeste eksperter i adfærdsdesign – Morten Münster, der bl.a. har skrevet ” Jytte fra marketing er desværre gået for i dag” – på Computerworld Cloud & AI Festival.
Du vil finde de poster i tabellen hvor en bestemt værdi forekommer mindst 5 gange, har jeg forstået det rigtigt? Det kan du få med nedenstående forespørgsel. For at teste det lavede jeg en tabel ken med felterne id og val. Forespørgslen er:
SELECT val, COUNT(val) antal FROM ken k1 WHERE val IN(SELECT val FROM ken k2 WHERE (SELECT COUNT(val) FROM ken where val = k1.val GROUP BY val) >= 5) GROUP BY val
I yderste select spørger jeg efter val og COUNT(val) for et bestemt udvalg af val værdier. I den mellemste select specificerer udvalget, nemlig de der har en bestemt count værdi, og i den inderste select sætter jeg denne count value til 5. (Det er muligt, at de der klogere er kan gøre det simplere.)
Du formulerer forespørgslen i php applikationen, og der modtager du resultatet og beslutter hvad du skal stille op dermed, så som at printe. For eksempel (også det kan gøres på flere forskellige måder, så du får måske flere forslag)
$sql = "SELECT val, COUNT(val) antal FROM ken k1 WHERE val IN(SELECT val FROM ken k2 WHERE (SELECT COUNT(val) FROM ken where val = k1.val GROUP BY val) >= 5) GROUP BY val"; $result = mysql_query($sql); while($row = mysql_fetch_array($result)) { [kode for at printe ud] }
Hvis du gerne vil kunne indstille hvor stor count skal være for at printe ud kan du placere værdien i en variabel, for eksempel:
$count = 5 [eller hvad du vil have] $sql = $sql = "SELECT val, COUNT(val) antal FROM ken k1 WHERE val IN(SELECT val FROM ken k2 WHERE (SELECT COUNT(val) FROM ken where val = k1.val GROUP BY val) >= $count) GROUP BY val"; o.s.v.
jakobdo har, mens jeg arbejdede på mit indlæg, foreslået en simplere løsning, og måske kan du bruge den. Men jeg lægger mærke til, at du så ikke får hvor mange gange hver værdi forekommer, kun at de skal forekomme mindst et bestemt antal gange.
$query = "SELECT felt, COUNT(felt) FROM tabel where aar=2012 and maaned=9 and dato=9 GROUP BY felt HAVING COUNT(felt) > 4"; $result = MYSQL_QUERY($query);
Er dette en "for sjov side" eller til professionelt brug? Hvis det er det sidste, skal du nok læse lidt mere om PHP, MySQL, sikkerhed osv. Jeg ville nok bruge MySQLi API og prepared statement, i stedet for MySQL.
michael_stim, #5, min kode fungerer i den test-setop jeg lavede, men det er naturligvis HAVING jeg skulle have brugt. Det er for længe siden jeg selv har været igang med disse sager.
Jeg samler ikke på point. Man kan godt dele point, du skal bare vente på at de andre har lagt svar, så markerer du deres svar i dropdownboksen og klikker på accepter (tror jeg det hedder).
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.