---
title: "Räkna ur Mysql databas."
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/192316-räkna-ur-mysql-databas"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "7516463"
published: "2014-05-22T14:24:47.000Z"
updated: "2014-05-31T14:24:41.000Z"
replies: 23
views: 2385
page: 1
pages: 2
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/192316-räkna-ur-mysql-databas"
---

# Räkna ur Mysql databas.

_Sida 1 av 2._

## #1 — 7516463, 2014-05-22T14:24Z

Hej.

Min php+mysql kunskap är lite begränsad.

Jag har en databas som samlar ihop data i kwh varje 2 minuter. Jag skulle vilja ha en kod i php där man kan räkna ihop datan under en viss period. t.ex Förbrukning under 1 vecka, 2 veckor... 1 månad, 2 månader...1 år osv...

tack på förhand.

Permalänk: https://www.webforum.nu/p/192316

## #2 — 7516463, 2014-05-22T20:15Z

Lite mer förklaring:

Jag har en kolumn med namnet:**DATETIME** med datum i format: *2014-05-18 13:42:36*

Sedan är kolumnen "Kwh" där värden från sensorn läggs in t.ex 0,02

Det jag vill ha ut är t.ex summan av värden från "kwh" mellan t.ex datum 2014-05-01 00:00:00 och 2014-05-07 00:00:00 för att få reda på förbrukningen den senaste veckan...

Permalänk: https://www.webforum.nu/p/2316242

## #3 — metalboy, 2014-05-23T05:58Z

Använd SUM() för att få fram summan.

```
SELECT SUM(Kwh) FROM tabell WHERE `datetime` BETWEEN '2014-05-01 00:00:00' AND '2014-05-07 00:00:00'
```

Notera att du måste använda backticks (\`) runt datetime om det är kolumnnamnet för datumkolumnen, eftersom datetime är ett reserverat ord i MySQL.

Permalänk: https://www.webforum.nu/p/2316243

## #4 — 7516463, 2014-05-23T06:12Z

Tack. Om man vill använda antalet rader istället? Ska jag använda row istället för datetime och sedan ange antalet rader istället för datum?

Permalänk: https://www.webforum.nu/p/2316244

## #5 — metalboy, 2014-05-23T06:22Z

Nu vet jag inte om jag förstår riktigt. Vill du ha summan av till exempel de 10 senaste raderna? Använd *LIMIT* för att begränsa antalet rader i resultatet. Till exempel så här:

```
SELECT SUM(Kwh) FROM tabell ORDER BY id DESC LIMIT 10
```

Permalänk: https://www.webforum.nu/p/2316245

## #6 — 7516463, 2014-05-23T06:35Z

Jo du förstod nog rätt...ska fixa det i kväll och se om jag får det atgt fungera

Permalänk: https://www.webforum.nu/p/2316246

## #7 — 7516463, 2014-05-23T14:05Z

så här ser min kod ut nu...

```
<?php
$opendb = mysql_connect("******", "******", "*******")
or die("Kunde inte ansluta till MySQL:<br />" . mysql_error());

mysql_select_db("logtemp")
or die("Kunde inte ansluta till databasen:<br />" . mysql_error());

$query = "SELECT SUM(B10000000D076C1D) FROM logtemp ORDER BY DATETIME DESC LIMIT 5;";
	 
$result = mysql_query($query) or die(mysql_error());

while($row = mysql_fetch_array($result)){
	echo round ($row['SUM(B10000000D076C1D)'],2);
	echo "<br />";
}
?>
```

Dock så räknar den i hop hela kolumnen även fast jag anger att den bara ska räkna de sista 5 raderna. Vad har jag gjort fel?

DATETIME är en kolumn i databasen jag har även provat att skriva \`datetime\` men det är samma sak där, den räknar ihop hela databasen.

Permalänk: https://www.webforum.nu/p/2316247

## #8 — metalboy, 2014-05-23T15:22Z

Hmm... testade lite själv nu, och det verkar som att du behöver göra en subselect för att slippa summera hela tabellen. Helknasigt tycker jag, men men :)

```
SELECT SUM(B10000000D076C1D) AS summa FROM (SELECT B10000000D076C1D FROM logtemp ORDER BY `datetime` DESC LIMIT 5) AS s
```

Permalänk: https://www.webforum.nu/p/2316248

## #9 — 7516463, 2014-05-23T15:27Z

Då gnäller den att raden:

```
	echo round ($row['SUM(B10000000D076C1D)'],2);
```

inte är correct

Permalänk: https://www.webforum.nu/p/2316249

## #10 — metalboy, 2014-05-23T15:29Z

Det är för att jag satte ett alias "summa" på det. Använd detta

```php
echo round (row['summa'], 2);
```

eller ta bort *AS summa* från SQL-frågan.

Permalänk: https://www.webforum.nu/p/2316250

## #11 — 7516463, 2014-05-23T15:35Z

Tack så mycket... nu är det precis som jag vill ha det... nu ska bara tidsramarna in så är allt klart.

Återigen Tack!

Permalänk: https://www.webforum.nu/p/2316251

## #12 — 7516463, 2014-05-26T16:43Z

Programmet Logtemp lägger in data varannan minut. I slutet av varje heltimme nollställer den räkneverket och börjar om igen.

Databasen ser ut så här:

```
DATETIME		B10000000D076C1D	id
2014-05-26 12:01:01	0.02			1
2014-05-26 12:03:02	0.04			2
2014-05-26 12:05:04	0.06			3
2014-05-26 12:07:01	0.08			4
2014-05-26 12:09:03	0.10			5
2014-05-26 12:11:01	0.12			6
2014-05-26 12:13:02	0.14			7
2014-05-26 12:15:04	0.20			8
2014-05-26 12:17:01	0.22			9
2014-05-26 12:19:03	0.30			10
...
2014-05-26 12:55:04	0.40			29
2014-05-26 12:57:01	0.42			30
2014-05-26 12:59:03	0.50			31
```

Jag vill kort och gott få ut aktuell förbrukning...alltså den sista xx:59 raden, för de senaste 2h, 6h,12h,24h...osv. hur ska jag göra detta? har suttit och försökt men får inte till det.

HJÄLP!

Permalänk: https://www.webforum.nu/p/2316260

## #13 — rhdf, 2014-05-27T01:29Z

Hmm om databasen ser ut sådär så är det ju en sak som slår mig.
Loggar den verkligen **aktuell förbrukning**? Det är inte total förbrukning den lägger in? Så för att få "minutvärden" (eg varannan minut) så får du ta en post minus föregående. 

Med SUM kommer du ju i så fall inte få förbrukningen utan en summa av totaler.
En dataserie som ser ut  exempelvis
0\.1, 0.2, 0.3, dvs 0.1 ökning/steg skall ju resultera i 0.3, inte 0.6

Permalänk: https://www.webforum.nu/p/2316262

## #14 — 7516463, 2014-05-27T04:03Z

Nä förbrukningen är ju inte konstant utan ökar lite olika beroende på förbrukningen.

Men det jag vill få ut är är hur man plockar ut de poster som är varje xx:59:xx för att sedan kunna summera som, men eftersom det är sekunder med ock databasen uppdateras inte exakt varje helsekunder alltså 12:00:00 utan det är någon sekunder som alltid skiljer sig åt.

Hur gör jag det? alltså antingen att kunna plocka ut raderna som 12:59 bara och inte 12:50:02 även fast sekunderna är med i databasen.

Och hur skriver jag för att plocka ut enstaka rader och summera dom.

Permalänk: https://www.webforum.nu/p/2316263

## #15 — 7516463, 2014-05-27T04:44Z

Eller... jag vet hur man plockar ut enstaka rader ut databasen och summera dessa.
så här ser det isåfall ut för 24h:

```
$query = "SELECT SUM(B10000000D076C1D) FROM logtemp WHERE id IN(11, 41, 71, 101, 131, 161, 191, 221, 251, 281, 311, 341, 371, 401, 431, 461, 491, 521, 551, 581, 611, 641, 671, 701)";
```

Men jag vill inte göra detta manuellt för varje dag utan att jag lägger in en kod som automatiskt plussar ihop var 30:e rad för varje dygn, Går det?

Permalänk: https://www.webforum.nu/p/2316264

## #16 — rhdf, 2014-05-27T17:58Z

> **[7516463 skrev:](https://www.webforum.nu/p/1571290)**
>
> Nä förbrukningen är ju inte konstant utan ökar lite olika beroende på förbrukningen.

Det jag menade var att datan ser ut att vara "total förbrukning" sedan senaste reset. Skulle det vara aktuell förbrukning / 2 minuter så skulle ju ingen reset behövas. Så för att få förbrukningen mellan 2 klockslag så är det just sista värdet innan reset (dvs XX:59) som är aktuellt. 

På något sätt känns det som att 
SELECT \* FROM logtemp WHERE MINUTE(DateTime)=59 borde funka, men jag har inte testat det

Edit:
Testade nu med en databas där jag hade massa datetime-värden
Select HOUR(datetime), B10000000D076C1D from logtemp WHERE MINUTE(datetime)=59 AND DATE(datetime)= DATE(now());
Skall ge dig en lista med timme och förbrukning för alla poster med minutvärde=59 för dagens datum.
Således borde väl 
Select SUM(B10000000D076C1D) from logtemp WHERE MINUTE(datetime)=59 AND DATE(datetime)= DATE(now()); ge dygnsförbrukningen

Permalänk: https://www.webforum.nu/p/2316265

## #17 — 7516463, 2014-05-28T12:03Z

ok en bit på vägen...

men om jag använder:

```
$query = "Select SUM(B10000000D076C1D) from logtemp WHERE MINUTE(datetime)=59 AND DATE(datetime)= DATE(now())";
$result = mysql_query($query) or die(mysql_error());

while($row = mysql_fetch_array($result)){
echo round ($row['SUM(B10000000D076C1D)'], 2); 
echo " kWh";
}
```

så får jag bara u "0"

Permalänk: https://www.webforum.nu/p/2316269

## #18 — @nders, 2014-05-28T12:31Z

Du kanske måste sätta ett alias i din fråga - jag är inte säker på att du kan referera till SUM() i din PHP-utskrift.

```
$query = "Select SUM(B10000000D076C1D) as summa from logtemp WHERE MINUTE(datetime)=59 AND DATE(datetime)= DATE(now())";
$result = mysql_query($query) or die(mysql_error());

while($row = mysql_fetch_array($result)){
echo round ($row['summa'], 2); 
echo " kWh";
}
```

mvh

Permalänk: https://www.webforum.nu/p/2316270

## #19 — 7516463, 2014-05-28T13:17Z

Nä, det ger bara 0...har provat med ' \` på DATETIME då kolumnen heter just DATETIME...men inget.

Permalänk: https://www.webforum.nu/p/2316271

## #20 — rhdf, 2014-05-28T16:12Z

Udda, jag testade förvisso bara konceptet att filtrera på minuter mm.
Har du testat att köra queryn direkt i MySQL workbench eller liknande, Då ser du ju om den ö.h.t returnerar nånting. Sen är ju frågan vad det är för datatyp på fältet B10000000D076C1D samtidigt ser du ju vad du har för värden.

Jag slängde ihop en test-tabell med samma fältnamn (utan id)

```
datetime                     B10000000D076C1D
2014-05-28 17:58:13	0.0000
2014-05-28 17:59:39	0.1000
2014-05-28 18:01:34	0.2000
2014-05-28 18:01:39	0.3000
2014-05-28 18:01:42	0.4000
2014-05-28 18:02:33	0.2000
```

Queryn 
SELECT  SUM(B10000000D076C1D) FROM logtemp WHERE MINUTE(\`datetime\`)=1 AND Date(\`datetime\`)=DATE(now());
 returnerade mycket riktigt 0.9000

Permalänk: https://www.webforum.nu/p/2316273

---

Tråden på webben: https://www.webforum.nu/amne/php/192316-räkna-ur-mysql-databas  
Nästa sida: https://www.webforum.nu/amne/php/192316-räkna-ur-mysql-databas/page2.md
