# MySQL Summe bilden



## nautiLus` (4. Juli 2004)

Hallo,

ich habe eine Tabelle mit 3 Zeilen:

clicks
---------------
12
13
15


Nun bräuchte ich eine Abfrage, die mir die Summe der ersten beiden Zeilen ausgibt. Nur das ganze ohne Subquery.

Also folgende Ausgabe: 

clicks
---------------
25

Wie mach ich das ab besten? Geht das über eine Abfrage oder lieber in PHP zusammenrechnen?

mfg Nauti


----------



## XChris (5. Juli 2004)

Hallo!

Du kannst dies mit SUM(Ausdruck) tun. Also so:


```
select sum(clicks) from MeineTabelle;
```

Das Ergebniss wäre dann eine: 40 ;-)

Übrigens bist Du meistens mit Berechnungen innerhalb der DB schneller, als wenn Du diese in PHP machen läst ... ist also die richtige Wahl.

Chris


----------



## Gorcky (5. Juli 2004)

XChris, du hast glaube ich nicht genau genug gelesen...  

Wie unterscheiden sich die ersten beiden Zeilen denn von der dritten ?
Sind sie generell kleiner als die Dritte ?
Haben deine Spalten vielleicht eine ID ?

Der Vorschlag von XChris war ja schon der richtige, summiert so allerdings ja nur alle Zeilen... ;-) 
Ich bräuchte jetzt irgendetwas um mit Where oder Order By angreifen zu können, um der Datenbank verständlich zu machen, welche Spalten ich summieren will.


----------



## nautiLus` (5. Juli 2004)

Ok, also oben angenommene Tabelle war jetzt mal theoretisch:

Ausschaun tut's so:


```
SELECT id, sitename, clicks FROM `links` order by clicks desc
```

gibt mir:

id-------sitename-------clicks
2-------------A-------------122--
1-------------B-------------100--
3-------------C--------------35--


Ich habe noch mehr Spalten zb ein datum.

ich brauch aber eine Abfrage die mir das ausgibt (also ohne PHP):

clicks
222

Danke, ciao

edit: Durch das Sortieren nach clicks wirds mit den Bedingungen schwer, weil ja die id's und Datum dann bunt durcheinendergewürfelt sind. Mit Subqueries wärs ja kein Problem ... die Frage ist aber: Gehts ohne auch?  Wenns da nicht eine Funktion oder sowas gibt, befürchte ich, dass wir da anstehen werden...


----------



## jenno (5. Juli 2004)

Mir ist noch nicht ganz klar, wovon die beiden Werte, die du zusammenaddieren willst, abhängen.  Oder anders ausgedrückt, welche beiden Werte willst Du denn zusammenaddieren?  Ganz allgemein!  Immer die zwei grössten?


----------



## nautiLus` (5. Juli 2004)

Ja genau, immer die 2 größten von der spalte clicks!


----------



## jenno (5. Juli 2004)

Also ich weiss jetzt nicht, wie man das mit sql abfragen kann.  Zumindest nicht mit mysql.  Allerdings bin ich der Meinung, dass man, da es sich ja nur um zwei Werte handelt, das ganz prima in php berechnen kann.  Einfach die beiden grössten Werte abfragen mit


```
SELECT clicks FROM links ORDER BY clicks DESC LIMIT 0, 2
```

und die hast Du ja dann mit php ganz fix addiert.

Wenn ansonsten noch jemand weiss, wie man das mit mysql lösen kann, dann bin ich auch schon gespannt.


----------



## Matthias Reitinger (5. Juli 2004)

```
SELECT SUM(clicks) as Summe FROM links ORDER BY clicks DESC LIMIT 2
```

Sollte so eigentlich klappen...


----------



## nautiLus` (5. Juli 2004)

> _Original geschrieben von Matthias Reitinger _
> 
> ```
> SELECT SUM(clicks) as Summe FROM links ORDER BY clicks DESC LIMIT 2
> ...




Das  summiert mir aber alle Zeilen nicht nur die ersten 2


----------



## jenno (5. Juli 2004)

Eben, und darum weiss ich nicht, ob das mit mysql überhaupt funktioniert.  Weil eigentlich sieht das für mich nach nem verschachtelten Select aus.  Aber das ist nichts für mysql.

Aber was spricht denn nun dagegen, die beiden Werte in php zu addieren?


----------



## nautiLus` (5. Juli 2004)

> Aber was spricht denn nun dagegen, die beiden Werte in php zu addieren?




Absolut nichts!
Ich wollte nur dazulernen und fragen ob soetwas geht.

Danke an alle!

mfg Nauti


----------



## Matthias Reitinger (5. Juli 2004)

Hoppla, stimmt, meine Lösung kann so gar nicht klappen :-( 

Das LIMIT bezieht sich ja nicht auf die Summierung.

Auf die Schnelle fällt mir jetzt auch keine andere Lösung ein, außer halt mit einem Sub Select.


----------



## Ralph (5. Juli 2004)

MySQL unterstüzt ja mittlerweile zum Teil Subselects. Mit einer älteren Version ist es aber auch möglich einfach ne temporöre Tabelle zu erstellen, die nur die beiden größten Werte enthält und diese dann zu addieren. Sind auch nur 2 Zeilen mehr Code 

Allerdings muss man sich ab nem Punkt dann wirklich fragen, ob addieren in der Programmiersprache performanter ist. Bei einer Liste mit 100 Links z.B. würde ich letzteres vorziehen


----------



## Gorcky (5. Juli 2004)

Ansonsten, als SQL-Lösung:


```
SELECT SUM(clicks) FROM (SELECT clicks FROM links ORDER BY clicks DESC LIMIT 0, 2)
```


----------



## XChris (6. Juli 2004)

Hallo!

Ich geb ja zu, dass ich die Aufgabenstellung nur kurz überflogen habe. Wie ich sehe wurde eine Lösung gefunden.

Nochmal zu: 


> Aber was spricht denn nun dagegen, die beiden Werte in php zu addieren?



Wie schon gesagt: Mathematische Funktionen sind wesentlich performanter unter MySQL - als wenn man sie mit PHP (unkommpiliert) ausführen läst.

Chris


----------



## jenno (6. Juli 2004)

Ja, aber manchmal muss man eben abwägen.  Und wenn für die gewünschte Abfrage noch ne temporäre Tabelle her muss...geht das dann nicht zu weit?  Und ist das dann wirklich perfomanter?


----------



## XChris (6. Juli 2004)

Es ist perfmormanter.

Ich habe noch nie erlebt, dass Mathematische Probleme schneller in PHP denn in MySQL gewesen wären. Vergiss nicht, PHP wird (wenn nicht vorkommpiliert) immer erst interpretiert. 

Chris


----------

