Avatar billede xpresand Nybegynder
01. november 2009 - 18:28 Der er 11 kommentarer og
1 løsning

Find største værdi

Hej

Jeg har en tabel som hedder Aar. I den har jeg rækker som består af:

jan feb mar apr maj jun jul aug sep okt nov dec

De indeholder hverisær antal besøgende i den måned.

Det jeg så skal have hjælp til er hvordan, kan jeg via PHP kan finde ud af i hvilken måned der har været flest besøgende?
01. november 2009 - 18:54 #1
Hvor sidder den tabel?  I en mysql database? Saa er det noget i retning af "SELECT maaned, MAX(besoegende) FROM Aar GROUP BY maaned".  Det henter du med PHP ved kode saa som:

<?
$result = mysql_query("SELECT maaned, MAX(besoegende) FROM Aar GROUP BY maaned");
while ($row = mysql_fetch_array($result))
{
  echo $row[0] . " " $row[1] . "<br/>"
}
?>

Hvis det sidder i en hjemmeside der bestaar eller er under udvikling saa send koden eller linket til siden.  Saa kan jeg vare mere konkret.
01. november 2009 - 18:58 #2
Jeg laeste spoergsmaalet for hurgtigt, det var ikke antal besoegende per maaned men maaneden med stoerst besoeg.  Saa skal vi have fat i en saakaldt sub-select.  Det vender jeg lige tilbage til (med mindre en anden kommer med loesningen foer mig.)
Avatar billede xpresand Nybegynder
01. november 2009 - 19:46 #3
Christian.. jeg venter spændt :)
01. november 2009 - 19:55 #4
Hvis tabellen kun indeholder et tal per maaned, nemlig totalbesoeget, saa er querien den foelgende:

SELECT maaned, besoeg
FROM aar
WHERE besoeg = (
SELECT MAX( besoeg )
FROM aar)

Hvis du har daglige besoegstal saaledes at du foerst maa finde total besoeg per maaned og derefter hvilken maaned havde det stoerste besoegstal saa virker det at lave et View, en hjaelpetabel, saaledes:

CREATE VIEW V_maxMaaned(maaned, besoegende)
AS SELECT maaned, SUM(besoeg)
FROM aar
GROUP BY maaned

og saa den foelgende query:

SELECT maaned, besoegende
FROM V_maxMaaned
WHERE besoegende = (
  SELECT MAX(besoegende)
  FROM V_maxMaaned)

For at teste det lavede jeg den foelgende tabel:

maaned  besoeg 
jan    5
jan    7
jan    3
jan    12
feb    17
feb    7
feb    3
mar    18
mar    11
mar    3
mar    6
mar    1

og fra den tabel giver ovenstaaende query det foelgende resultat:

maaned  besoeg 
feb    17

Det kan saa hentes fra mysql med php statements som jeg skrev i mit tidligere indlaeg.

Som sagt, hvis du sender en konkret hjemmeside hvor det skal virke kan jeg komme med forslag.
Avatar billede xpresand Nybegynder
01. november 2009 - 20:00 #5
Min tabel ser ikke helt sådan ud. Det er til en besøgstæller så den ser sådan her ud.

Tabellen hedder aar.

Den består af
brugerid
jan
feb
mar
apr
maj
jun
jul
aug
sep
okt
nov
dec.

Så får hver tæller er der et tal ud for hver måned.

Du kan se et billed eksempel her:
http://www.fluii.dk/pic/FluiiDK-001983.png
01. november 2009 - 22:11 #6
Saa vil jeg mene at du har den forkerte struktur i din tabel.  Du benytter dig ikke af den relationelle databasestruktur; jan, feb, o.s.v. er samme slags ting.  En normaliseret struktur er en tabel med, for eksempel, bruger, maaned, besoeg.  For at teste lavede jeg denne tabel med fire brugere over tre maaneder:

bruger  maaned  besoeg 
47da    jan    2
47da    feb    200
47da    mar    33
4827    jan    857
4827    feb    490
4827    mar    33
484d    jan    0
484d    feb    36
484d    mar    8
485t    jan    22
485t    feb    33
485t    mar    555
48dg    jan    0
48dg    feb    20
48dg    mar    37
48a4    jan    1
48a4    feb    23
48a4    mar    57

(Saa skulle du nok have en tabel bruger og en "foreign key" fra aar til bruger for at holde styr paa hvilke brugere du har.)

En saadan tabel er det nemt at spoerge, se nedenfor.  Hvordan man skal skrive en query der finder den stoerste vaerdi af 12 forskellige kolonner met 12 forskellige vaerdier ved jeg ikke (det kan vel lade sig goere, men det goer vold paa de relationelle principper.)

Hvis du, med min foreslaaede tabel struktur, regelmaessigt vil finde den maaned med det hoejeste totale besoegstal saa laver du en gang for alle i databasen den foelgende View:

CREATE VIEW V_maxMaaned(maaned, besoeg)
AS SELECT maaned, SUM(besoeg)
FROM aar2
GROUP BY maaned

og saa bliver din query:

SELECT maaned, besoeg
FROM V_maxMaaned
WHERE besoeg = (
  SELECT MAX(besoeg)
  FROM V_maxMaaned)

Resultatet af den query paa min foreslaaede tabel med data er:

maaned  besoeg 
jan    882
Avatar billede xpresand Nybegynder
01. november 2009 - 22:41 #7
Har nu opbygget tabellen på den måde, for at spare på pladsen. Når man har flere 100 brugere er det lidt mange rækker at have liggende i tabellen.

Så der findes altså ikke nogen former for PHP script som jeg kan bruge, når min tabel er opbygget på den måde?
Avatar billede arne_v Ekspert
01. november 2009 - 23:24 #8
Mange rækker i MySQL er > 10 millioner rækker.

Bortset fra at jeg ikke vil kalde det et normaliserings problem og at jeg ville bruge en numerisk værdi for måned, så er jeg helt enig med Christians forslag.
Avatar billede arne_v Ekspert
01. november 2009 - 23:31 #9
Hvis du vil fortsætte med din struktur skal du ud i noget:

SELECT IF(jan>feb AND jan>mar,'Jan',IF(feb>mar,'Feb','Mar') FROM tabel WHERE brugerid=X

eller

SELECT IF(SUM(jan)>SUM(feb) AND SUM(jan)>SUM(mar),'Jan',IF(SUM(feb)>SUM(mar),'Feb','Mar') FROM tabel

udvidet fra 3 til 12 måneder. Det bliver nogle meget lange udtryk.

Alternativt kan du bruge en SELECT som bare henter data og lader din PHP kode finde den største kolonne - det er ikke så svært igen.
Avatar billede xpresand Nybegynder
02. november 2009 - 08:00 #10
Okay, jeg prøver, at kigge på din kode. :)
03. november 2009 - 19:16 #11
xpresand, fik du kikket paa koden?  Forventer du flere inputs.  Ellers ville det vaere godt om du ville lukke spoergsmaalet.  Det giver god orden, og saa staar det ikke laengere som aabent i min liste af indlaeg.  Bed om svar fra de som skal have points (jeg har allerede sendt et svar hvis du mener at have brugt mit indlaeg.)  Saa er der ryddet op, og vi er klar til de naeste spoergsmaal.
Avatar billede xpresand Nybegynder
04. november 2009 - 19:34 #12
Jeg har fundet en anden kode, som løser problemet på en helt anden måde. Men du får dine point alligevel som tak for hjælpen.
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