php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 01.11.2011, 15:10  
Neuer Benutzer
 
Registriert seit: 10.10.2011
Beiträge: 13
PHP-Kenntnisse:
Anfänger
Aldaris befindet sich auf einem aufstrebenden Ast
Standard For-To Schleife in MySQL

Hallo Forum,

ich beiße mir wieder einmal meine Zähne an einem MySQL Problem aus. Ich möchte eine For-To Schleife laufen lassen und innerhalb der Schleife mehrere Anweisungen ausführen. Im Internet finde ich dazu zahlreiche Beispiele auf Webseiten, diese funktionieren aber nicht so, wie ich es möchte. Vor allem würde ich gerne versuchen, keine Funktion oder Prozedur zu benutzen - falls das möglich ist. So sieht mein Code aus:

Code:
DECLARE counter INT DEFAULT 0;
schleife: LOOP
  SET counter = counter + 1
  SELECT 
    {ANWEISUNGSBLOCK}
  IF counter = 10 THEN
    LEAVE schleife;
  END IF;
END LOOP simple_loop;
Ich bekomme folgende Fehlermeldung:

#1064 - You have an error in your SQL syntax; check the manuar that corresponds to your MySQL server version for the right syntax to use near 'DECLARE counter INT DEFAULT 0' at line 1.

Ich benutze MySQL 5.5.16.

Kann mir jemand sagen, wo genau mein Fehler liegt?

Viele Grüße

Aldaris
Aldaris ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 01.11.2011, 15:16  
Erfahrener Benutzer
 
Benutzerbild von wolf29
 
Registriert seit: 17.03.2010
Beiträge: 1.833
PHP-Kenntnisse:
Fortgeschritten
wolf29 wird schon bald berühmt werdenwolf29 wird schon bald berühmt werden
Standard

Hi.

Deine Syntax ist auch nicht korrekt. Sicher das Du nichts vergessen und/oder "falsch" verschachtelt hast? Schau mal hier:

http://dev.mysql.com/doc/refman/5.1/...trictions.html

mfg Wolf29
__________________
while (!asleep()) sheep++;

Unterschätze nie jemanden der einen Schritt zurück geht! Er könnte Anlauf nehmen.
wolf29 ist offline   Mit Zitat antworten
Alt 01.11.2011, 15:34  
Erfahrener Benutzer
 
Registriert seit: 19.06.2009
Beiträge: 837
PHP-Kenntnisse:
Fortgeschritten
Jens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nett
Standard

Zitat:
Zitat von Aldaris Beitrag anzeigen
Vor allem würde ich gerne versuchen, keine Funktion oder Prozedur zu benutzen - falls das möglich ist.
Ist es nicht. Kontrollflusssteuerungssprachkonstrukte funktionieren nur innerhalb von gespeicherten Routinen. Gleiches gilt übrigens mit Abstrichen auch für DECLARE. Außerhalb von Begin und End geht das auch nicht.

Was genau soll das denn werden, wenn es fertig ist?

Gruß Jens
Jens Clasen ist offline   Mit Zitat antworten
Alt 01.11.2011, 18:39  
Neuer Benutzer
 
Registriert seit: 10.10.2011
Beiträge: 13
PHP-Kenntnisse:
Anfänger
Aldaris befindet sich auf einem aufstrebenden Ast
Standard

Hi,

danke für die schnellen Antworten.

Mein Ziel ist ein View, der mir meine vorhandene Abfrage in eine neue Tabelle schreibt. Dabei soll eine Rollierung angewandt werden, so dass man immer Jahresscheiben betrachtet. Dazu benutze ich diesen Code:

Code:
SELECT
		n.Date,
		((((n.Price + o.Price) - (n.Price*2))/n.Price)) * ((SUM(op.Price * op.MCap) / SUM(np.Price * op.MCap)) -1) AS xy,
		((((n.Price + o.Price) - (n.Price*2))/n.Price)) AS x,
		((SUM(op.Price * op.MCap) / SUM(np.Price * op.MCap)) -1) AS y,
		POW(((SUM(op.Price * op.MCap) / SUM(np.Price * op.MCap)) -1),2) AS y2,
                FOR-TO-VARIABLE as Number
	  FROM
		equities n
		  INNER JOIN equities o
			ON n.ID=o.ID
			  AND n.Date=o.Date + INTERVAL 1 DAY
			  AND n.Date > "2010-10-13" - FOR-TO-VARIABLE
			  AND n.Date < "2011-10-13" - FOR-TO-VARIABLE		  
		  INNER JOIN portfolio np
			ON n.Date=np.Date
		  INNER JOIN portfolio op
			ON op.ID=np.ID
			  AND np.Date=op.Date + INTERVAL 1 DAY
			  AND n.Date > "2010-10-13" - FOR-TO-VARIABLE
			  AND n.Date <"2011-10-13" - FOR-TO-VARIABLE			  			  
	  GROUP BY
		n.Date DESC,
		n.ID ASC
Meine Überlegung war nun, mit einer for-to Schleife jeweils das Datum vom ersten bis zum letzten verfügbaren Wert durchzugehen und den Durchgang in der Spalte "Number" zu speichern. Das erlaubt dann das spätere Auswerten der Werte. Die Variable habe ich jetzt mal als "FOR-TO-VARIABLE" im Code gekennzeichnet.

Funktioniert denn der Loop in einer Prozedur in einem View? Oder würdet ihr vorschlagen, das anders zu lösen?
Aldaris ist offline   Mit Zitat antworten
Alt 02.11.2011, 10:12  
Erfahrener Benutzer
 
Registriert seit: 19.06.2009
Beiträge: 837
PHP-Kenntnisse:
Fortgeschritten
Jens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nett
Standard

Ich bin mir eigentlich ziemlich sicher, dass es bessere Ansätze gibt, die ohne diese Schleife klar kommen. Wenn Du wirklich über alle Daten iterieren willst, dann wäre das ganze als simpler Join realisierbar.

Ich tue mich allerdings mit Deiner Beispielquery ein wenig schwer. Du sagst, Du willst über Daten iterieren, hast aber eine Join-Bedingung nach dem Muster "Datum<NochnDatum-Laufvariable". Wenn Du über das Datum iterierst, dann ist doch auch die Laufvariable ein Datum und damit würden Deine <> Vergleiche jeweils Äpfel (Daten) mit Birnen (Datenintervalle) vergleichen.

Irgendwas stimmt da noch nicht. Bitte hol noch mal ein bißchen weiter aus und beschreibe und, was FOR-TO-VARIABLE für ein Wert ist und wofür er letztendlich Verwendung finden soll.

Gruß Jens
Jens Clasen ist offline   Mit Zitat antworten
Alt 02.11.2011, 14:41  
Neuer Benutzer
 
Registriert seit: 10.10.2011
Beiträge: 13
PHP-Kenntnisse:
Anfänger
Aldaris befindet sich auf einem aufstrebenden Ast
Standard

Hallo Jens,

vielen Dank für Deine Antwort.

Mein Ziel ist eine rollierende Betaberechnung (http://de.wikipedia.org/wiki/Betafaktor) mittels MySQL durchzuführen.

Ich habe ein Tabelle mit den Werten der zu überprüfenden Aktie (equities) und eine Tabelle mit anderen Aktien (portfolio) Letzteres stellt das Marktportfolio dar und ist die Grundlage, einen Marktindex zu berechnen. Die Query oben berechnet mir nun als Ausgangsbasis die Daten, um das Beta vom 13.10.2010 bis 13.10.2011 zu berechnen.

Ich möchte nun eine Query/View, die genau das für alle Jahresscheiben tut, also auch vom 12.10.2010 bis 12.10.2011, 11.10.2010 bis 11.10.2011 usw.

Deswegen war meine Idee, das mittels for-to Schleife zu lösen und jeweils die Datumsgrenzwerte um eins zu reduzieren, um so die Jahresscheiben zu berechnen. Genau das sollte die Variable "FOR-TO-VARIABLE" machen, die die Laufvariable der Schleife ist.

Falls es eine Möglichkeit gibt, das ohne Schleife durchzuführen, wäre mir das auch lieber, ich habe nur keine Lösung dafür erkennen können. Hast Du eine Idee, wie man das machen könnte?

Viele Grüße

Aldaris

Geändert von Aldaris (07.11.2011 um 16:14 Uhr).
Aldaris ist offline   Mit Zitat antworten
Alt 02.11.2011, 21:26  
Erfahrener Benutzer
 
Registriert seit: 19.06.2009
Beiträge: 837
PHP-Kenntnisse:
Fortgeschritten
Jens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nett
Standard

Och Du immer mit Deinen Statistikfragen - das Fach hab ich schon im Studium nicht leiden können...

Bitte geh noch mal einen Schritt weiter und poste dazu, wie Du den Betafaktor für eine Jahresscheibe aus den Ergebnissen der Query bestimmst. Ich müsste da jetzt nämlich echt auch nachschlagen und ein bißchen Zeit rein stecken. Deinen Worten entnehme ich, dass Du die passende Formel schon rum liegen hast?

Auf Basis dessen, was ich bisher sehe, ist wahrscheinlich eine Query möglich, die direkt das gewünschte Endergebnis aus der Datenbank ermittelt. Einzig mir fehlt die passende Gruppierfunktion um das Gesamtergebnis zu ermitteln. Die Rohdaten selbst lassen sich - wahrscheinlich - wie folgt ermitteln:

Code:
SELECT
  dt.Date,
  dt.scheibe,
  s.xy,
  s.x,
  s.y,
  s.y2
FROM
    (SELECT @i:=0) i /* Initialisierung der Laufvariable */
  CROSS JOIN
    (
      SELECT 
        @i:=@i+1 AS scheibe,
        d.Date 
      FROM 
        equities d 
      GROUP BY 
        d.Date
    ) dt  /* Daten */
  INNER JOIN 
    ( /* Statistikdaten */
      SELECT
		n.Date,
		((((n.Price + o.Price) - (n.Price*2))/n.Price)) * ((SUM(op.Price * op.MCap) / SUM(np.Price * op.MCap)) -1) AS xy,
		((((n.Price + o.Price) - (n.Price*2))/n.Price)) AS x,
		((SUM(op.Price * op.MCap) / SUM(np.Price * op.MCap)) -1) AS y,
		POW(((SUM(op.Price * op.MCap) / SUM(np.Price * op.MCap)) -1),2) AS y2
      FROM
		equities n
		  INNER JOIN equities o /* Vortagsstand Aktie*/
			ON n.ID=o.ID
			  AND n.Date=o.Date + INTERVAL 1 DAY
		  INNER JOIN portfolio np /* Portofolio am Tag n */
			ON n.Date=np.Date
		  INNER JOIN portfolio op /* Vortagsstand Portofolio-Eintrag */
			ON op.ID=np.ID
			  AND np.Date=op.Date + INTERVAL 1 DAY
	  GROUP BY
		n.Date,
		n.ID,
		o.Price
	) s
    ON s.Date BETWEEN dt.Date AND dt.Date - INTERVAL 1 YEAR
Sag mal, was wird das eigentlich für eine Anwendung, wenn es fertig wird? Woran bastelst Du da rum? Die Art von Fragen sind in PHP-Foren dann ja doch eher selten.

Gruß Jens
Jens Clasen ist offline   Mit Zitat antworten
Alt 04.11.2011, 22:36  
Neuer Benutzer
 
Registriert seit: 10.10.2011
Beiträge: 13
PHP-Kenntnisse:
Anfänger
Aldaris befindet sich auf einem aufstrebenden Ast
Standard

Hi Jens,

vielen Dank für den Code. Ich dachte mir, dass ich mit den Statistiksachen aus der Reihe tanze, um ein wenig Abwechslung reinzubringen .

Mit PHP hat die Thematik nicht viel zu tun, da es eine reine MySQL Umsetzung ist. Ich war nur auf der Suche nach einem MySQL Forum und bin dabei auf dieses ziemlich aktive hier gestoßen. Ich hoffe, dass das kein Problem ist .

Ich habe mir das gestern und heute angesehen und versucht zu verstehen, wie die Berechnung funktioniert. Im groben und ganzen verstehe ich, worauf Du hinaus möchtest. Leider liefert der Code aber kein Ergebnis und ich kann nicht nachvollziehen, warum.

Das Beta wird wie folgt berechnet (b = Cov(X,Y)/Var(Y)):

Code:
(COUNT(s.xy) * SUM(s.xy)) - (SUM(s.x) * SUM(s.y)))/((COUNT(s.xy) * SUM(s.y2)) - POW(s.y,2)
X ist dabei die Aktie und Y das Marktportfolio. Dieser Code läuft über alle Zeilen und liefert daher das Gesamtergebnis.

Aus den entsprechenden vorgegebenen Spalten (siehe Dein Code) müsste man mit einem INNER JOIN arbeiten, um dann das gewünschte Ergebnis zu bekommen. Ich kann es wie gesagt, nur momentan nicht testen, weil der Code kein Ergebnis liefert.
Aldaris ist offline   Mit Zitat antworten
Alt 07.11.2011, 16:14  
Neuer Benutzer
 
Registriert seit: 10.10.2011
Beiträge: 13
PHP-Kenntnisse:
Anfänger
Aldaris befindet sich auf einem aufstrebenden Ast
Standard

Hi,

ich habe den Fehler im Code gefunden, beim Intervall muss der kleinere Datumswert vor dem größeren stehen:

Code:
    ON s.Date BETWEEN dt.Date - INTERVAL 1 YEAR AND dt.Date

Zum Beta kommt man nun wie folgt:

Code:
SELECT

dt.Date,
((COUNT(s.xy) * SUM(s.xy)) - (SUM(s.x) * SUM(s.y)))/((COUNT(s.xy) * SUM(s.y2)) - POW(s.y,2))


FROM
    (SELECT @i:=0) i /* Initialisierung der Laufvariable */
  CROSS JOIN
    (
      SELECT 
        @i:=@i+1 AS scheibe,
        d.Date 
      FROM 
        equities d 
      GROUP BY 
        d.Date
    ) dt  /* Daten */
  INNER JOIN 
    ( /* Statistikdaten */
      SELECT
		n.Date,
		((((n.Price + o.Price) - (n.Price*2))/n.Price)) * ((SUM(op.Price * op.MCap) / SUM(np.Price * op.MCap)) -1) AS xy,
		((((n.Price + o.Price) - (n.Price*2))/n.Price)) AS x,
		((SUM(op.Price * op.MCap) / SUM(np.Price * op.MCap)) -1) AS y,
		POW(((SUM(op.Price * op.MCap) / SUM(np.Price * op.MCap)) -1),2) AS y2
      FROM
		equities n
		  INNER JOIN equities o /* Vortagsstand Aktie*/
			ON n.ID=o.ID
			  AND n.Date=o.Date + INTERVAL 1 DAY
		  INNER JOIN portfolio np /* Portofolio am Tag n */
			ON n.Date=np.Date
		  INNER JOIN portfolio op /* Vortagsstand Portofolio-Eintrag */
			ON op.ID=np.ID
			  AND np.Date=op.Date + INTERVAL 1 DAY
	  GROUP BY
		n.Date,
		n.ID,
		o.Price
	) s
    ON s.Date BETWEEN dt.Date - INTERVAL 1 YEAR AND dt.Date

GROUP BY
dt.scheibe DESC
Jetzt möchte ich diesen Code in einen View bauen, aber ich bekomme die Meldung, dass das wegen des Sub Selects nichts geht. Kennt jemand von euch eine Möglichkeit, das Problem zu umgehen?

Viele Grüße

Aldaris

Geändert von Aldaris (08.11.2011 um 14:14 Uhr). Grund: Klammerfehler
Aldaris ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
MYSQL Schleife funktioniert nicht DonDemf PHP Einsteiger 4 12.07.2011 08:57
[Erledigt] Datensätze von einer MySQL in eine andere MySQL Datenbank abgleichen Marvin75 Datenbanken 7 10.06.2011 18:00
[Erledigt] Schleife 2 auf Schleife 1 beziehen bei XML Abfrage ePole PHP Einsteiger 16 17.12.2010 09:58
[Erledigt] MySQL Link Resource in einer statischen Variablen speichern Lenki PHP-Fortgeschrittene 8 18.03.2010 16:37
[Erledigt] Probleme mit While Mysql schleife GigaToni PHP Tipps 2009 11 29.08.2009 14:32
[Erledigt] MySQL Update Schleife the-rod Datenbanken 8 08.07.2009 21:19
[Erledigt] Kann keine Umlaute im mysql client eingeben Oger Datenbanken 9 02.04.2009 11:54
MySQL Konsole und Umlaute unter Windows [LÖSUNG] f4ckm5 Datenbanken 8 30.03.2009 22:10
Warum wird die erste Schleife nur einmal durchlaufen ? PHP Tipps 2006 12 03.03.2006 20:04
MySQL Server startet nicht mehr richtig... Datenbanken 16 03.03.2006 19:40
Suche Tipps für Persormance-Steigerung (Geld für Nützliches) Beitragsarchiv 18 16.08.2005 10:57
MYSQL läuft nur wenn /tmp auf 777 Datenbanken 5 06.07.2005 08:38
mysql root passwort vergessen Datenbanken 1 29.05.2005 11:33
MySQL auslesen ohne while schleife PHP Tipps 2005 3 10.05.2005 12:43
Einfache Schleife gesucht für mysql nach Excel PHP Tipps 2004 2 01.09.2004 12:28

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
mysql schleife beispiel, schleife in mysql, for schleife und mysql, mysql loop schleife, mysql select mit variable loop, mysql schleife for, for and to-schleife, mysql 5.5 declare variable -procedure, mysql for schleife beispiel, mysql select count mehrfach mit anderen werten durchlaufen, mysql schleife, for schleife mysql ergebnis, php mysql schleife for, sql-fehler 1064

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:11 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum