View mit Funktion
Joe
- datenbank
0 Vinzenz Mai0 Ilja0 Joe
Hallo,
habe noch ein grundsätzliches Wissensdefizit wie ich eine Funktion für MySql, und einen View, der diese Funktion benutzen soll, per PHP absetze.
Die eigentliche Aufgabenstellung ist folgende:
-- MySql-Funktion Berechne (param1, param2, param3, pram4, param 5) return Sortvalue
-- dazu einen Select/View mit mehreren Parametern aufrufen. Ein Teil der zum Rechnen benutzten Werte kommt aus dem Select/View.
Pseudobeispiel:
Select w1,w2,w3,w4, func_view1(w1, 10.7, 2.99) as sortvalue from tabelle1 order by sortvalue; // Die Berechnung ist sehr komplex.
Alsdann folgt direkt die Ausgabe in ein Listobjekt mittels PHP.
Anstatt die Tabelle sequenziell in PHP abzuarbeiten und die Daten nebst Sortierwert in einen Array zwischenzuspeichern, zu sortieren und anschliessend auszugeben, dachte ich mir, das es auch geschickter gehen muß, so das weniger mittels php gehandelt werden muß.
Leider fehlt es mir an Syntaxkenntnissen für die Schreibung der neuen MySql-Funktion, alsoauch das Wissen, ob es überhaupt machbar ist, und wie ich es beispielsweise korrekt einbaue.
Ich bräuchte einfache Beispiele, oder Links zu solchen, die mich grundsätzlich auf den richtigen Weg bringen.
Was ich nicht brauche ist ein Link zu MySql mit dem Hinweis, da steht doch alles ;-)
Es gibt einfach zu wenige brauchbare Beispiele im Netz. Diese konnten mir bisher nicht weiterhelfen.
Gruß Joe
Hallo,
// komplexe Berechnung bringt ein Ergebnis, das zum Sortieren benutzt werden wird.
-- MySql-Funktion Berechne (param1, param2, param3, pram4, param 5) return Sortvalue
ja toll, darunter kann ich mir alles und nichts vorstellen. Grundsätzlich: ist überhaupt kein Problem, MySQL 5.x und neuer vorausgesetzt.
-- dazu einen Select/View mit mehreren Parametern aufrufen. Ein Teil der zum Rechnen benutzten Werte kommt aus dem Select/View.
Pseudobeispiel:
Select w1,w2,w3,w4, func_view1(w1, 10.7, 2.99) as sortvalue from tabelle1 order by sortvalue; // Die Berechnung ist sehr komplex.
Genauso allgemein gehalten ...
Leider fehlt es mir an Syntaxkenntnissen für die Schreibung der neuen MySql-Funktion, alsoauch das Wissen, ob es überhaupt machbar ist, und wie ich es beispielsweise korrekt einbaue.
Folge den Beispielen im MySQL-Handbuch, ...
Was ich nicht brauche ist ein Link zu MySql mit dem Hinweis, da steht doch alles ;-)
oh, das wolltest Du ja nicht. Ok, dann verzichte ich auf den Link. ;-)
Welches Problem hast Du beim Nachvollziehen der dortigen Beispiele?
Welche einfache Funktion kannst Du bereits nicht umsetzen?
Ändert sich der Sortvalue eines Datensatzes nur dann, wenn sich der Datensatz ändert? Kann der Sortvalue mit dem reichhaltigen Funktionsangebot von MySQL berechnet werden? Wenn ja, benötigst Du *keine* Funktion.
Willst Du konkrete Hilfe, so frage konkret.
Freundliche Grüße
Vinzenz
Hallo,
// komplexe Berechnung bringt ein Ergebnis, das zum Sortieren benutzt werden wird.
-- MySql-Funktion Berechne (param1, param2, param3, pram4, param 5) return Sortvalue
ja toll, darunter kann ich mir alles und nichts vorstellen. Grundsätzlich: ist überhaupt kein Problem, MySQL 5.x und neuer vorausgesetzt.
-- dazu einen Select/View mit mehreren Parametern aufrufen. Ein Teil der zum Rechnen benutzten Werte kommt aus dem Select/View.
Pseudobeispiel:
Select w1,w2,w3,w4, func_view1(w1, 10.7, 2.99) as sortvalue from tabelle1 order by sortvalue; // Die Berechnung ist sehr komplex.Genauso allgemein gehalten ...
Leider fehlt es mir an Syntaxkenntnissen für die Schreibung der neuen MySql-Funktion, alsoauch das Wissen, ob es überhaupt machbar ist, und wie ich es beispielsweise korrekt einbaue.
Folge den Beispielen im MySQL-Handbuch, ...
Was ich nicht brauche ist ein Link zu MySql mit dem Hinweis, da steht doch alles ;-)
oh, das wolltest Du ja nicht. Ok, dann verzichte ich auf den Link. ;-)
Welches Problem hast Du beim Nachvollziehen der dortigen Beispiele?
Welche einfache Funktion kannst Du bereits nicht umsetzen?
Ändert sich der Sortvalue eines Datensatzes nur dann, wenn sich der Datensatz ändert? Kann der Sortvalue mit dem reichhaltigen Funktionsangebot von MySQL berechnet werden? Wenn ja, benötigst Du *keine* Funktion.Willst Du konkrete Hilfe, so frage konkret.
Freundliche Grüße
Vinzenz
Jepp,
das Problem ist, das ich ume eine spezielle Berechnung nicht herumkommen werde. Daher das allgemeine Beispiel. Eine der Functions habe ich schon mal geschrieben. AUs obiger Antwort ist zu ersehen, das mein Problem scheinbar nicht einfach gelöst werden kann, weil ich im Prinzip 5 Funktionsergegnisse in einem Select mit einfügen müßte, und selbst dann noch fehlen mir 3 von 4 Ergebnissen.
Ich möchte den Spass nicht in eine Tabelle schreiben müssen, da diese lediglich temporär wären, Mysql aber den Speicher auf der Platte, soweit mir von früher bekannt ist, nicht wieder so einfach freigibt. Kann aber auch nicht unendlich viel Memory opfern, weil dann die Maschine im Multisessionbetrieb sicher in die Grütze geht.
Erstmal frühstücken ;-)
Danke
Gruß Joe
Hallo,
bitte keine Fullquotes.
das Problem ist, das ich ume eine spezielle Berechnung nicht herumkommen werde. Daher das allgemeine Beispiel.
das überhaupt nicht weiterhilft.
Eine der Functions habe ich schon mal geschrieben. AUs obiger Antwort ist zu ersehen, das mein Problem scheinbar nicht einfach gelöst werden kann, weil ich im Prinzip 5 Funktionsergegnisse in einem Select mit einfügen müßte, und selbst dann noch fehlen mir 3 von 4 Ergebnissen.
und selbst das ist überhaupt kein Problem.
Ich möchte den Spass nicht in eine Tabelle schreiben müssen, da diese lediglich temporär wären, Mysql aber den Speicher auf der Platte, soweit mir von früher bekannt ist, nicht wieder so einfach freigibt. Kann aber auch nicht unendlich viel Memory opfern, weil dann die Maschine im Multisessionbetrieb sicher in die Grütze geht.
Nö, mit ziemlicher Sicherheit nicht. Wenn, dann machst Du was falsch. Deine paar Datensätze stellen das für ein DBMS, das seinen Namen wert ist, überhaupt kein Problem dar - auch nicht für MySQL. Wenn anhand eines Datensatzes bekannt ist, wie der Sortvalue aussieht, dann ist es eine gute Idee, den Sortvalue gleich zu berechnen und fix zu speichern. Trigger bieten sich dafür an.
Freundliche Grüße
Vinzenz
Ok,
lasse ich mich dann drauf ein.
IMMER variabel:
Dachbreite unten: 20,1m
Dachbreite ohen: 13,7m
Dachhöhe: 6,8m
Freiraum oben: 0,222m
Freiraum unten 0,255m
Freiraum links: 0,125m
Freiraum links: 0,144m
Modulabstand vertikal: 0,020m
Modulabstand horizontal: 0,017m
Bemerkung: Die Verlegung soll immer nur gerade oder ungerade Reihenergebnisse bringen. Sobald eine Reihe von grade auf ungerade oder umgekehrt errechnet wird, soll die neue Reihe um 1 decriminiert werden. Die Rechenergebnisse dürfen natürlich in einer temporären DB gespeichert werden.
1. Berechnung: Maximale Anzahl der von oben nach unten hochkant verlegter Module. Ausgabe soll sein: "nnnn.n:hou"
2. Berechnung: Maximale Anzahl der von unten nach oben hochkant verlegter Module. Ausgabe soll sein: "nnnn.n:huo"
3. Berechnung: Maximale Anzahl der von oben nach unten quer verlegter Module. Ausgabe soll sein: "nnnn.n:qou"
4. Berechnung: Maximale Anzahl der von unten nach oben quer verlegter Module. Ausgabe soll sein: "nnnn.nkw:quo" Ist danach formatiert als String auszugeben.
Tabelle enthält:
ModulID, Modulhöhe, Modulbreite, Modulleistung, ...
Abfrageergebnis nach Errechneter_Modulleistung und Errechneter_Modulanzahl absteigend sortiert.
Tabellenspalten: Hersteller+Modulbezeichnung+Errechnete_Modulanzahl+Errechnete_Leistung+ModulId
Erwünschte Ausgabe in Listbox(multiselect), wo man sich mehrere zur weiteren Verarbeitung markieren kann. Anzeige Hersteller+Modul+{kw}
That's vorerst all... Der weitaus kompliziertere Teil, nämlich die automatische Wechselrichterauslegung vergessen wir erstmal. Hier werden die temporär zu errechnenden Werte noch heftiger und in der Anzahl weit mehr.
Also, somal zwischen Frühstück und Mittag bekomm ich das nicht hin ;-)
Aber Kopfschmerzen. Aber: Step by Step, jeden Tag ein bischen...
Gruß Joe
Sorry,
da sind noch ein paar kleine Fehler:
Format: "nnnn.nkw:Ausrichtung" wäre korrekt.
und oben steht 2 mal Freiraum links, sollte natürlich 1 mal auch rechts heissen.
Hmm,
wie nun, hab die Hosen runtergelassen!
Wars das jetzt?
Bin doch echt konkret geworden.
Keine Idee, was die beste Vorgehensweise wäre?
Gruß Joe
das überhaupt nicht weiterhilft.
und selbst das ist überhaupt kein Problem.
Nö, mit ziemlicher Sicherheit nicht. Wenn, dann machst Du was falsch. Deine paar Datensätze stellen das für ein DBMS, das seinen Namen wert ist, überhaupt kein Problem dar - auch nicht für MySQL. Wenn anhand eines Datensatzes bekannt ist, wie der Sortvalue aussieht, dann ist es eine gute Idee, den Sortvalue gleich zu berechnen und fix zu speichern. Trigger bieten sich dafür an.
Hmm, nun, wie ist das mit einem Trigger, der immer dann wenn ein User eine temporäre Berechnung zu seinen Eingaben braucht?
Wie übergebe ich die Anfrage an den Trigger?
Da ich eigentlich zwischendurch nichts in die DB schreiben möchte, ändert sich ja für den Trigger nichts, sodaß er natürlich nicht reagiert. Also muß dann doch was weggeschrieben werden, damit der Trigger arbeitet. Das sehe ich ein. So könnte man für den Trigger die Variablen in einer Anfragetabelle speichern, und schon sollte er loslegen.
Der Trigger muß ja für jeden Datensatz irgendwo was hinschreiben, oder? Geht das mit einer virtuellen Tabelle, die ich in ein folgendes Select-Statement einbauen kann?
Andernfalls müßte er für jeden anfragenden User eine Tabelle replizieren, die er dann zusätzlich mit den Berechnungen vollballern darf, und die ab dann zur weiteren Verwendung zur Verfügung stehen würde. In diesem Fall muß die Tabelle muß spätestends nach Beendigung der Session wieder entfernt werden.
Wie automatisiert man sowas? Gibt es da Mysql-Eigene Aufräumroutinen?
Mich würde sehr ein Beispielcode für den Trigger interessieren, wo der Trigger selbstständig die temporäre Tabelle anlegt und Zeugs reinschreibt.
Jetzt fehlt mir noch eine Kontrolle über den Trigger. Ich muß ja die Ergebnisse irgendwie aufnehmen und weiterverarbeiten können. Wann weiß ich, das der Trigger fertig hat?
Gibts irgendwo Beispiele zu diversen Triggern, die ansatzweise so strukturiert sind, das ich für mich daraus was ableiten kann?
Gruß Joe
yo,
grundsätzlich hat eine view keine parameter in der art wie sie bei einer funktion oder eine prozedur vorhanden sind. eine view ist eine gespeicherte abfrage in der datenbank. "technisch" wird die view wie eine tabelle benutzt und nicht wie eine funktion. view und funktion sind also erst mal zwei getrennte paar schuhe. mal ein beispiel für den aufruf einer view "test_view".
SELECT spalte1_der_view, spalte2_der_view, etc.
FROM test_view
;
natürlich kann man die view auch mit anderen tabellen kombieren oder sogar mit weiteren views. wenn du die view hast, kannst du darin die funktion einbauen, entweder direkt in der view oder eben ausserhalb, je nachdem was du erreichen willst. und natürlich kann man dann auch nach dem wert, den die funktion zurück gibt, sortieren.
Ilja
yo,
grundsätzlich hat eine view keine parameter in der art wie sie bei einer funktion oder eine prozedur vorhanden sind. eine view ist eine gespeicherte abfrage in der datenbank. "technisch" wird die view wie eine tabelle benutzt und nicht wie eine funktion. view und funktion sind also erst mal zwei getrennte paar schuhe. mal ein beispiel für den aufruf einer view "test_view".
SELECT spalte1_der_view, spalte2_der_view, etc.
FROM test_view
;natürlich kann man die view auch mit anderen tabellen kombieren oder sogar mit weiteren views. wenn du die view hast, kannst du darin die funktion einbauen, entweder direkt in der view oder eben ausserhalb, je nachdem was du erreichen willst. und natürlich kann man dann auch nach dem wert, den die funktion zurück gibt, sortieren.
Ilja
Danke, ich weiß nun, das ich Stored Function brauche.
Ein nicht triviales Problem ist, das eigentlich 5 Functions aufgerufen werden müssen. Was mir dabei nicht gefällt ist, das erst die 5. Funktion das beste Ergebnis von Function 1..4. Ale Ergebnisse sind aber wichtig und sollen ihren Platz in einer Weiterverwertung haben.
Die eigentliche Aufgabe ist, die beste Verlegeart für ein jeweiliges Solarmodul zu finden, auf einer Basis zu übergebender Parameter des Daches, Modulabstände zum Dachrand von oben, unten und jeweils auch seitlich, sowie Modulabstand.
Die Datenbank hat im Endausbau ca. 10000 Module. Diese können mintestends auf 4 Arten verlegt werden. Eigentlich müßte ich 40000 Ergebnisse zur Verfügung stellen. Ich werde aber versuchen, die Ergebnisse irgendwie in einem String zusammenzufassen, wobei zusätzlich der höchste errechnete Wert dem String nochmal vorangestellt wird, damit eine Sortierung einfacher zustandekommen kann.
Zusammenfassend dachte ich, ich könnte einem View alle Parameter mitgeben, und diesen die 4 Function ausführen lassen und die Rückgabe entsprechend zusammenbauen.
Ich überlege, ob dies auch mit einer Quasi-Masterfunktion gemacht werden kann die die anderen Funktionen bedient und das Ergebnis zusammenstellt. Dann brauche ich nur diese einmal im Select mit einbauen, und der Frosch hat schon mal ein paar Locken ;-)
Den zurückgegebenen Wert kann ich anschließend in PHP wieder aufdröseln und
entsprechend.
Problematik hierbei ist allerdings, das z.B. bei allen Ergebnisse für Modul1 dieses an 1. 3. 7. 8. Stelle einsortiert würde. Modul2 an 2. 4. 5. 6. Stelle.
Würde ich nun 8 Datensätze haben, könnte ich einwandfrei ausgeben.
Habe ich aber nur 2, verschwinden die Positionen 3..8.
Denke, ich brauche erstmal eine Kanne Kaffee und ein Pfund Bananen ;-)
Bisp Joe