Oprettet man. d. 10. september 2012 kl. 11:06:41

KenSchultzDK
KenSchultzDK (1.560 point. Point ude: 0)

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

Skrevet man. d. 10. september 2012 kl. 11:27:02| #1

Jeg ville nok gøre det i SQL:

SELECT ditFelt, COUNT(ditFelt) FROM dinTabel GROUP BY ditFelt

Skrevet man. d. 10. september 2012 kl. 12:43:35| #2

KenSchultzDK
KenSchultzDK (1.560 point)
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

Skrevet man. d. 10. september 2012 kl. 14:11:31| #3

jakobdo
jakobdo (184.392 point)
www.simitu.dk
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.

Skrevet man. d. 10. september 2012 kl. 14:31:42| #4

Christian_Belgien
Christian_Belgien (50.868 point)
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.

Skrevet man. d. 10. september 2012 kl. 14:38:37| #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";

Skrevet man. d. 10. september 2012 kl. 14:41:45| #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";

Skrevet man. d. 10. september 2012 kl. 15:08:22| #7

KenSchultzDK
KenSchultzDK (1.560 point)
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.

Skrevet man. d. 10. september 2012 kl. 15:13:26| #8

$felt = mysql_result($result,0,"felt");

Skal være:

$felt = $row["felt"];

Skrevet man. d. 10. september 2012 kl. 15:25:06| #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.

Skrevet man. d. 10. september 2012 kl. 16:15:41| #10

Christian_Belgien
Christian_Belgien (50.868 point)
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.

Skrevet man. d. 10. september 2012 kl. 16:57:00| #11

#10
Min kommentar var til #3 ;-)

Skrevet man. d. 10. september 2012 kl. 17:46:13| #12

Christian_Belgien
Christian_Belgien (50.868 point)
Michael_stim, #11 - ok.  Men jeg accepterer alligevel, at HAVING er den rigtige løsning, selv om min omvej kan bringes til at virke.

Skrevet tir. d. 11. september 2012 kl. 08:10:09| #13

KenSchultzDK
KenSchultzDK (1.560 point)
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)"];

Skrevet tir. d. 11. september 2012 kl. 09:27:25| #14

#13

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

Og skriver den ud med:

$antal = $row['antal'];

Skrevet tir. d. 11. september 2012 kl. 09:43:06| #15

KenSchultzDK
KenSchultzDK (1.560 point)
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).

Skrevet tir. d. 11. september 2012 kl. 09:45:24| #16

KenSchultzDK
KenSchultzDK (1.560 point)
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 :-)

Skrevet tir. d. 11. september 2012 kl. 09:54:56| #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).

Skrevet tir. d. 11. september 2012 kl. 10:02:36| #18

KenSchultzDK
KenSchultzDK (1.560 point)
OK.

Jeg lukker tråden.

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   


Seneste spørgsmål

ASCII til HTML?

Oprettet den 21. maj 2013 kl. 21.14
PeaceDealer giver 30 point for svar | Giv et svar »

.htacces redirect

Oprettet den 15. maj 2013 kl. 19.57
casper- giver 200 point for svar | Giv et svar »

form-insert med dropdown php

Oprettet den 14. maj 2013 kl. 08.57
agent_qa giver 45 point for svar | Giv et svar »








Tips & Tricks fra PC World

Teaser billede

Her er seks Google Labs-funktioner, som du skal slå til med det samme

Gmail Labs giver dig adgang til en masse smarte funktioner, som Googles ingeniører leger med i øjeblikket.


Anmeldelser fra PC World

Teaser billede

Test: Samsung Galaxy S4 er et hit - trods gøglertricks

Kan Samsung beholde førertrøjen i det store Android-race? Galaxy S4 er smækfyldt med innovative funktioner, men også med en del gøgl. Er det for meget? Få vores dom over Samsungs nye topmodel.


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Tre smarte trick som gør Windows 8 bedre

Boot direkte til skrivebordet, få en strategisk godt placeret luk-knap og slip for at logge ind. Her er tre tips til Windows 8, som gør det nemmere at blive venner med styresystemet.


Nyheder fra Computerworld

Teaser billede

De 21 værste it-vaner - og hvordan du bryder dem

Du har helt sikkert en af disse dårlige it-vaner. Se her hvad du kan gøre.


IT Kurser
Samarbejdspartnere

Udgiver · © 2013 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger