Avatar billede KenSchultzDK Nybegynder
10. september 2012 - 11:06 Der 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)?

Mvh. Ken
Avatar billede michael_stim Ekspert
10. september 2012 - 11:27 #1
Jeg ville nok gøre det i SQL:

SELECT ditFelt, COUNT(ditFelt) FROM dinTabel GROUP BY ditFelt
Avatar billede KenSchultzDK Nybegynder
10. september 2012 - 12:43 #2
Ja, den giver mig en oversigt i SQLen men jeg ønsker at printe en oversigt via PHP der viser de værdier som forekommer mere end X gange.

Kan optællingen via COUNT gemmes som en variabel i stil med MYSQL_NUMROWS e.l.?

Så kan jeg nemlig teste på den og bruge den til at bestemme om værdien skal printes eller ej.

Eller kan man evt. sætte det direkte ind i queryen så f.eks. at COUNT skal være minimum 5 e.l.?

Mvh. Ken
Avatar billede jakobdo Ekspert
10. september 2012 - 14:11 #3
Kunne du ikke lave:

$sql = "SELECT * FROM dinTabel WHERE COUNT(felt) > ANTAL GROUP BY felt";

Så printer den "kun" dem, som har antal mere en ANTAL.
10. september 2012 - 14:31 #4
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.
Avatar billede michael_stim Ekspert
10. september 2012 - 14:38 #5
Tror ikke det fungerer (uden at have testet). Tror man i så fald skal have fat i HAVING.

$sql = "SELECT * FROM dinTabel GROUP BY felt HAVING COUNT(felt) > 5";
Avatar billede michael_stim Ekspert
10. september 2012 - 14:41 #6
Eller som christian_belgien skriver, hvis man vil have antal med:

$sql = "SELECT felt, COUNT(felt) FROM dinTabel GROUP BY felt HAVING COUNT(felt) > 5";
Avatar billede KenSchultzDK Nybegynder
10. september 2012 - 15:08 #7
Hej

Nu er jeg kommet længere :-)

Jeg har nu denne kode:

$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);

while($row = mysql_fetch_array($result))
{
$felt = mysql_result($result,0,"felt");
print "<tr><td><b>$felt</b></td></tr>";
}

Men det ser ikke ud til at virke. Der er en eller anden uendelig løkke eller lignende. Den printer bare den første værdi i én uendelighed.
Avatar billede michael_stim Ekspert
10. september 2012 - 15:13 #8
$felt = mysql_result($result,0,"felt");

Skal være:

$felt = $row["felt"];
Avatar billede michael_stim Ekspert
10. september 2012 - 15:25 #9
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.
10. september 2012 - 16:15 #10
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.
Avatar billede michael_stim Ekspert
10. september 2012 - 16:57 #11
#10
Min kommentar var til #3 ;-)
10. september 2012 - 17:46 #12
Michael_stim, #11 - ok.  Men jeg accepterer alligevel, at HAVING er den rigtige løsning, selv om min omvej kan bringes til at virke.
Avatar billede KenSchultzDK Nybegynder
11. september 2012 - 08:10 #13
Tak Michael

Det sker når man kopierer noget gammel kode ;-)

Den sidste detalje jeg mangler er muligheden for også at printe hvor mange gange værdien forekommer.

Kan jeg definere en variabel der hedder således?:
$antal = $row["count(felt)"];
Avatar billede michael_stim Ekspert
11. september 2012 - 09:27 #14
#13

Ja, eller også giver du den et navn. SELECT felt, COUNT(felt) AS antal....

Og skriver den ud med:

$antal = $row['antal'];
Avatar billede KenSchultzDK Nybegynder
11. september 2012 - 09:43 #15
Det virker bare nu :-)

Tak til Jacob, Christian og især Michael for hjælpen :-)

Nu skal jeg bare finde ud af at dele point ud, men jeg kan ikke finde ud af hvordan man gør det (er ny her).
Avatar billede KenSchultzDK Nybegynder
11. september 2012 - 09:45 #16
Ser ikke ud til at jeg kan tildele point til kommentarer.

Men hvis michael_stim kan lave et svar så kan jeg give de 30 point til dig :-)
Avatar billede michael_stim Ekspert
11. september 2012 - 09:54 #17
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).
Avatar billede KenSchultzDK Nybegynder
11. september 2012 - 10:02 #18
OK.

Jeg lukker tråden.
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester