Knud Schröder: (MySQL)(PHP) Problem(chen) bei Select-Abfrage

Hallo Leute !

Hab mal wieder so ein klitze-kleines Select-Statement-Problem.

Irgendwie fällt mir die Sache mit SQL ein bisschen schwer, weiss nicht so genau warum, vielleicht,
weil ich von dBase komme?
Ich bin es halt gewohnt, schön brav durch die Datei (Tabelle) zu "skippen" (ein Satz nach dem anderen)
mit nem geöffnetem INdex vielleicht und hab dann irgendwas überprüft, verändert oder gelöscht, was auch
immer.

So hab ich zum Beispiel mal die Aufgabenstellung, dass ich alle diejenigen Sätze anzeigen lassen soll,
wo das Feld Rabatt und das Feld Sondernachlass zusammen einen vorgegebenen Wert unterschreiten.
Das heisst, ich muss wohl im Select-Statement die mathematische Berechnung einfliessen lassen, oder?

Und wie sieht`s dann aus, wenn ich bei allen gefundenen Sätzen ein Feld verändern soll (updaten)?

Und jetzt womöglich noch, alle "nicht gefundenen" Sätze bekommen auch eine Veränderung.

Gibt`s denn sowas, wie setze Zeiger auf 1. Datensatz und gehe Schritt für Schritt bis ans Ende?
So eine Art "do while not eof, skip ...".

Oder wie bekommt man obengenanntes Problem(chen) hin?

Ich bin echt dankbar für jede Art von Unterstützung. Ich bin mir sicher, dass das hier etwas vermessen
klingt, aber ich hoffe dennoch, dass sich einer erbarmt und mir seine Zeit opfert, um mir zum helfen.

Danke!

Knud

  1. hi knud,

    So hab ich zum Beispiel mal die Aufgabenstellung, dass ich alle diejenigen Sätze anzeigen lassen soll,
    wo das Feld Rabatt und das Feld Sondernachlass zusammen einen vorgegebenen Wert unterschreiten.

    select * from table where (rabatt+sondernachlass) < vorgabe;

    Und wie sieht`s dann aus, wenn ich bei allen gefundenen Sätzen ein Feld verändern soll (updaten)?

    update table set feld=wert where (rabatt+sondernachlass) < vorgabe;

    Und jetzt womöglich noch, alle "nicht gefundenen" Sätze bekommen auch eine Veränderung.

    update table set feld=wert where (rabatt+sondernachlass) >= vorgabe;

    servus
    stephan

    1. hi stephan,

      so weit alles klar, Danke schon mal !

      Das Problem ist aber, dass bei meiner Überprüfung "etwas" kompliziertere Berechnungen notwendig sind,
      bei denen ich nicht weiss, wie ich die in eine einzige Zeile packen soll.
      Die Überprüfung läuft bei mir in einer Funktion ab, die mir den gerechneten Wert zurückgibt.
      Das ist eine Mischung aus for-next-Schleife, ein paar If-Abragen und lauter so ein Kram.
      (Hängt mit Staffelbonus und solchen Sachen zusammen.)
      Nur in eine einzige Zeile krieg ich das nicht.

      Lässt sich denn innerhalb der Where-Klausel auch eine Funktion aufrufen, die wohl geeigneterweise
      True zurückgibt und dementsprechend werden die Sätze selektiert.

      Zur Zeit, als so eine Art Problemumgehung, lese ich alle Sätze (ohne Where) und laufe dann nochmal
      durch eine do-while-Schleife durch, um die Überprüfungen zu machen. NIcht ideal, oder ?

      Danke nochmals für die Hilfe!

      Knud

      1. Lässt sich denn innerhalb der Where-Klausel auch eine Funktion aufrufen, die wohl geeigneterweise
        True zurückgibt und dementsprechend werden die Sätze selektiert.

        In SQL alleine nicht.

        Bestimmte Datenbanken erlauben es, sogenannte "stored procedures" in der Datenbank selbst dauerhaft abzulegen. Diese sind dann für die SQL-Engine ansprechbar, genau wie interne Funktionen, etwa max(spalte) usw.
        Es kommt aber auf die Datenbank an, ob so etwas geht und in welcher Sprache diese Funktionen dann geschrieben werden müssen.
        (z. B. Oracle kann es und hat dafür eine eigene algorithmische Sprache PL/SQL, die sich vage wie PASCAL liest, aber selbst u. a. auch wieder SQL-Anweisungen verwenden kann.)

        Zur Zeit, als so eine Art Problemumgehung, lese ich alle Sätze (ohne Where) und laufe dann nochmal
        durch eine do-while-Schleife durch, um die Überprüfungen zu machen. NIcht ideal, oder ?

        In der Tat. Du denkst bei Deiner Problemlösung bisher streng algorithmisch (3GL). Das aber "beißt" sich mit dem Konzept von SQL, welches lösungs- (4GL) und mengenorientiert denkt.

        Versuche, die Menge der zu verarbeitenden Einträge wirklich nur als Menge zu sehen und ihre Eigenschaften zu beschreiben; überlasse es der Datenbank, diese Menge irgendwie zu berechnen, statt selbst irgendwas sequentiell abarbeiten zu wollen.

        Der Umfang Deiner Funktionen innerhalb der WHERE-Klausel sollte nicht das Problem sein - es muß Dir nur gelingen, sie aus Sprachmitteln von SQL zu formulieren, also ohne Schleifen und Abfragen, alleine durch einen Ausdruck - eventell auch aufgrund des Ergebnisses von SubQueries, falls Deiner Datenbank "richtiges SQL" kann.