Multiplizieren?

thorax

Grünschnabel
Hallo!

Ich habe folgende Datenstruktur, hier ein mal ein paar Beispieldatensätze:
1|2
2|1
1|3
1|3

Nun suche ich eine MySQL-Funktion, die multiplizieren kann (also es soll 2|18 rauskommen, da 1*2*1*1=2 und 2*1*3*3=18 ist)

Wäre super wenn mir da jemand helfen könnte

Gruß
Chris
 
Hi,

Eine Funktion dafür gibt es meines Wissens nicht. Aber versuche doch folgenden Algorithmus (Schrittfolge):

  1. alle zu multiplizierende Datensätze abfragen
  2. die Datensätze der Reihe nach zum Letzten durchlaufen
  3. das produkt aller bisherigen Zahlen in einer gesonderten Variable speichern (bei jedem Sprung zum nächsten Datensatz)
  4. wenn fertig, die gesonderte Variable ausgeben
 
Das Problem ist, dass ich diesen Code in Verbindung mit anderem SQL Code verwenden wollte, daher würde ich nur sehr ungern eine Schleife benutzen, sondern dies mit MySQL lösen.

Gruß
Chris
 
Eine Gruppenfunktion zum Multiplizieren gibt es in MySQL nicht.
Du köttest es mit Benutzervariablen versuchen:
Code:
SET @f1 := 1, @f2 := 1;
SELECT 
  @f1 := @f1 * feld1,
  @f2 := @f2 * feld2
FROM
  tabelle
Das liefert allerdings den vollen Satz an Datensätzen, obwohl Dich ja nur der letzte interessieren dürfte...
Sorry, mehr fällt mir grade nicht ein.
Martin
 
Hallo!

Schau mal hier:

Code:
mysql> select * from numbers;
+-------+
| value |
+-------+
|     1 |
|     2 |
|     3 |
|     4 |
+-------+
4 rows in set (0.00 sec)

mysql> SET @f1 := 1;
Query OK, 0 rows affected (0.00 sec)

mysql> select max(t.val) Produkt from (SELECT
    ->   @f1 := @f1 * value as val
    -> FROM
    ->   numbers) t;
+------------+
| Produkt |
+------------+
|         24 |
+------------+
1 row in set (0.00 sec)

Das Problem mit dieser Lösung ist, dass es zu "falschen" Werten kommen kann wenn diese Abfrage von 2 Benutzern gleichzeitig ausgeführt wird, da sich dann beide die Variablen Teilen... oder sind die Variablen etwa "Sessionlokal"?

//edit: Cool scheinbar sind die Variablen wirklich Sessionbezogen, d.h. es gibt mit dieser Lösung kein Problem :)

Gruß Tom
 
Zurück