Avatar billede mjl Nybegynder
23. februar 2011 - 22:25 Der er 9 kommentarer og
1 løsning

Summen af værdier pr. uge

Fra MySQL hvor min dato er lagt ind som time() - altså det 10 cifrede tal for dato - skal jeg finde summen af "antal" ugevis (uge 1 = 450, uge 2 = 256 o.s.v.) ... hvordan i al verden gør jeg det?

Mit datofelt hedder "orderdate" og det jeg skal bruge summen af "antal" ...

Håber det kan forståes !

hilsen Martin
Avatar billede majbom Novice
23. februar 2011 - 23:42 #1
måske du lige skulle smide et table-dump
Avatar billede mjl Nybegynder
24. februar 2011 - 06:12 #2
Jamen DB'en er enkel ...

id orderdate antal
9 1294614000 2
10 1294714000 5
11 1294954000 13
24. februar 2011 - 08:08 #3
De vaerdier du viser i orderdate kolonnen ser ud til at vaere unix_timestamps og representere tidspunkterne 10 januar midnat, 11 januar midnat, og 13 januar 22:26:40.

Hvis det er unix_timestamps, saa kan de, i mysql, omsaettes til ugenumre ved funktionen WEEK(FROM_UNIXTIME()).

For eksempel giver SELECT WEEK(FROM_UNIXTIME(1294614000)) resultatet 2 hvilket er korrekt for 10 januar.  Hvis din tabel kan indeholde vaerdier for mere end et kalenderaar kan du bruge SELECT YEARWEEK(FROM_UNIXTIME(1294614000)) der giver 201102, korrekt aar og ugenummer for 10 januar.

Men for at jeg skal kunne foreslaa php kode der skal kunne sammentaelle vaerdier per uge bliver du nok noedt til at sige hvilken sql du bruger (saasom mysql) og vise det script du opretter tabellen med (saa jeg kan se datatypen) og vise hvordan du fylder vaerdier i tabellen (saasom mysql_query("INSERT INTO mytable ....." Jeg har ikke kunnet finde en mysql datatype der hedder time().
Avatar billede mjl Nybegynder
24. februar 2011 - 12:02 #4
Det er som du tror ...

1. MySQL
2. Jeg bruger PHP og INSERT INTO mytable ...
3. time() i PHP laver UXIXTIME (129414000)

F.eks. $dato = time(); INSERT INTO ..... (orderdate) VALUES ($dato) o.s.v.

Hjalp det lidt !?
24. februar 2011 - 12:07 #5
Men information om tabellen selv maa jeg ikke faa?  Navn, felter, datatype for felterne.  Paa et eller andet tidspunkt maa der have vaeret oprettet en tabel saasom:  CREATE TABLE mytable(id INT, ordervalue DATETIME, antal INT).  Kan du bekraefte eller rette det?  Eller er det en hemmelighed?
Avatar billede mjl Nybegynder
24. februar 2011 - 12:16 #6
Nej nej he he sorry ...

Id = int 11 denne værdi er unik mv.
Orderdate int 11
Antal int 11
24. februar 2011 - 12:22 #7
Det forklarer problemerne at du bruger int som datatype for orderdate.  Saa gaar du glip af inbyggede mysql funktioner saasom de ovennaevnte.  Jeg vil foreslaa at du omlaegger tabellen.  Jeg staar og skal afsted, men jeg kan, hvis du oensker, i aften foreslaa queries der kan saette op en ny og mere funktionel tabel og kan flytte indholdet fra den nuvaerende tabel til den nye med den nye datastruktur.  Med det paa plads skulle det ikke vaere saa vanskeligt at at summere per ugenummer.
Avatar billede mjl Nybegynder
24. februar 2011 - 12:42 #8
1000 tak - lyder dejligt !!!
24. februar 2011 - 19:38 #9
Ok, saa er jeg med igen.

Af en eller anden grund har du ikke givet mig navnet paa tabellen, og jeg gaetter paa at du gemmer flere ting i tabellen end id, orderdate, og antal, men det du ogsaa af en eller anden grund heller ikke fortalt.  (Hvad har du egenligt i den tabel som er saa hemmeligt?)  Jeg har derfor i mine tests gaaet ud fra en tabel med navnet mjl1 og med de tre kolonner id INT, orderdate INT, og antal INT og med auto-nummerering af id feltet.

Det ser saa ud til at du, naar du opretter en ny ordre, fastsaetter opretelsestidspunktet med 'time()' og gemmer det i databasen.  Jeg gaar ud fra denne kode:

$dato = time();
$antal = ???
mysql_query("INSERT INTO mjl1 VALUES(NULL, $dato, $antal");  (Med NULL laver du plads til automatisk indsaettelse af den naeste id vaerdi.)

Jeg foreslaar, som tidligere sagt, at du gaar over til at gemme dato og tid med datatypen DATETIME i stedet for med INT.  Du kan oprette en ny tabel i mysql saaledes:

CREATE TABLE mjl2(id INT, orderdate DATATIME, antal INT);

Du omsaetter INT orderdate vaerdierne til DATETIME vaerdier med FROM_UNIXTIME(orderdate).  Du kan automatisk indsaette vaerdierne fra mjl1 i mjl2 saaledes:

INSERT INTO mjl2 SELECT NULL, FROM_UNIXTIME(orderdate), antal FROM mjl1

og saa maa du aendre din php kode til at indsaette nye ordrer saaledes:

mysql_query("INSERT INTO mjl2 VALUES(NULL, NOW(), $antal");

Og endelig kommer jeg tilbage til dit oprindelige spoergsmaal, finde summen ar antal per ugenummer.  Her vil jeg foreslaa denne kode:

<?
$link = [connection to database]

$result = mysql_query("SELECT WEEK(orderdate) as week, SUM(antal) as antal FROM mjl2 GROUP BY week")or die(mysql_error());
while($row = mysql_fetch_array($result))
{
  $week = $row['week'];
  $antal = $row['antal'];
  echo "uge $week total antal $antal <br>";
}

mysql_close($link);

?>

Med en testside (som du kan se her http://christianjorgensen.be/mjl.php ) og en minimal testdatabase fik jeg dette resultat:

uge 2 total antal 30
uge 8 total antal 50
Avatar billede mjl Nybegynder
24. februar 2011 - 20:09 #10
Så hemmeligt er det heller ikke :o) men din løsning er alligevel blevet perfekt med de sparsomme oplysninger !

Jeg takker 1000 gange af hjertet !!
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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