L.T.: mysql / Unmögliche Query?

Hi,

ich hatte die Frage so oder so ähnlich vor graumer Zeit schonmal gestellt, finde aber den Post nicht wieder. Seinerzeit hatte dedlfix mir geraten, die Bedingung nicht in die Query zu packen, was ich dann auch so machte. Aber ich bin nicht ganz zufrieden mit der Lösung, wenngleich sie erstmal korrekt arbeitet.

Abfrageteil: (Die Zahlen vor den mysql-Passagen stellen den Key im Ergebnisarray $row dar).

  
...  
22 ADDDATE(m.mdatum, INTERVAL m.Faellig DAY),  
23 ...  
24 r.Storno  
25 UNIX_TIMESTAMP(ADDDATE(r.rdatum , INTERVAL r.Faellig DAY)),  
26 UNIX_TIMESTAMP(ADDDATE(m.mdatum, INTERVAL m.Faellig DAY)),  
...  

  
// Fälligkeit  
if ( (empty($row[26])) || (is_null($row[26])) ) {         // Wenn Tage addiert zu Mahnung leer, dann ...  
$faelligkeit = $row[25];                                // gilt Tage addiert auf RG-Datum  
} else {                                                 // ansonsten gilt...  
$faelligkeit = $row[26];                                // Tage addiert auf Mahnung  
}  
  
if ($row[24] == 1) {     // RG ist storniert oder gutgeschrieben  
$mahnstufe = "-";  
}  
  
$faellig = 0;  
if ( ($faelligkeit < time()) && ($row[23] != 1) && ($row[13] == 1) && ($row[24] != 1) ) {  
// Hinweis, daß Mahnung fällig ist  
$faellig = 1;  

Arbeitet soweit ganz ok.

Aber:

Ich lasse das Ergebniss seitenweise anzeigen. Wenn ich nun ausschließlich die mahnfähigen Rechnungen anzeigen lassen will, dann zeigt mir mein EWeg immer noch bspw. 5 Seiten an, aber dann eben nur 3-4 Rechnungen je Seite, da ich diese ja erst innerhalb der while-Schleife beim durchgehen des $row-Arrays filtere.

Ich bräuchte also doch z.b. einen Weg, um den Filter (die Selektion) bereits in die Query zu legen.

?

  1. Tach!

    ich hatte die Frage so oder so ähnlich vor graumer Zeit schonmal gestellt, finde aber den Post nicht wieder.

    Versuch mal, dich an ein selten genug vorkommendes Wort zu erinnern, was du da verwendet hast. Variablennamen und andere Codeteile  können dafür geeignet sein. Ein gleichbleibender Autorenname täte es auch.

    Seinerzeit hatte dedlfix mir geraten, die Bedingung nicht in die Query zu packen, was ich dann auch so machte.

    Vermutlich, weil sich die Datensätze mit einer Query nur sehr umständlich oder gar nicht ermitteln ließen.

    Ich lasse das Ergebniss seitenweise anzeigen. Wenn ich nun ausschließlich die mahnfähigen Rechnungen anzeigen lassen will, dann zeigt mir mein EWeg immer noch bspw. 5 Seiten an, aber dann eben nur 3-4 Rechnungen je Seite, da ich diese ja erst innerhalb der while-Schleife beim durchgehen des $row-Arrays filtere.
    Ich bräuchte also doch z.b. einen Weg, um den Filter (die Selektion) bereits in die Query zu legen.

    Zwei Vorschläge: Ermittle die Seitenanzahl und paginiere erst nach der nachträgliche Filterung. Steck die Filterung in eine Stored Procedure, oder schreib eine Stored Function, die intern komplex ermittelt aber nach außen nur die Information, ob selektiert werden soll oder nicht.

    dedlfix.

    1. Hi dedlfix,

      Versuch mal, dich an ein selten genug vorkommendes Wort zu erinnern, was du da verwendet hast. Variablennamen und andere Codeteile  können dafür geeignet sein. Ein gleichbleibender Autorenname täte es auch.

      Gute Idee. Ich habs gefunden.

      Vermutlich, weil sich die Datensätze mit einer Query nur sehr umständlich oder gar nicht ermitteln ließen.

      Ebenso war das. Aber ich hatte mich vertan, es ging um ein anderes Thema.

      Zwei Vorschläge: Ermittle die Seitenanzahl und paginiere erst nach der nachträgliche Filterung. Steck die Filterung in eine Stored Procedure, oder schreib eine Stored Function, die intern komplex ermittelt aber nach außen nur die Information, ob selektiert werden soll oder nicht.

      Die Seitenanzahl ergibt sich aus der Anzahl der Treffer innerhalb der Ergebnissmenge. Daher wäre es von Vorteil, die Selektion schon in die Query zu packen.

      Die Stored Proceduere bzw. function Idee gefällt mir gut. Aber ich habe damit noch nie gearbeitet. Wie fange ich damit an?

      1. Tach!

        Die Stored Proceduere bzw. function Idee gefällt mir gut. Aber ich habe damit noch nie gearbeitet. Wie fange ich damit an?

        So wie eigentlich immer man da vorgehen sollte. Zuerst wäre ein Überblick über die Möglichkeiten und generellen Vorgehensweisen sinnvoll. Also MySQL-Handbuch aufschlagen und nachlesen. Wie man Sored Procedures und Functions definiert, wirst du finden. Was man in ihrem Inneren verwenden kann, sagt das Kapitel MySQL Compound-Statement Syntax. Du sienst da unter anderem, wie man Variablen erstellt und verwendet, Flow Control Statements für die Beeinflussung des Programmflusses, auch das Condition Handling wird dir vermutlich nicht erspart bleiben. Wichtig aber werden Cursors sein. Das ist so eine Art foreach für eine Ergebnismenge. Und vielleicht, dass man temporäre Tabelle nimmt, wenn man eine Ergebnismenge erstellen möchte. Die Ergebnisse kann man nämlich nicht einfach in einen Ausgabekanal schicken, sondern muss sie zunächst sammeln. Am Ende kommt dann ein SELECT auf diese temporäre Tabelle, einfach so, quasi ins Nichts, und das ist dann das, was als Ergebnismenge einer Storage Procedure entsteht. Bei einer Function hingegen gibt es ein definiertes RETURN.

        Und noch ein Tipp: Nimm die MySQL Workbench, damit wird das Entwickeln etwas einfacher. Aber nichtsdestotrotz gibt es keinen Debug-Mechanismus. Wenn du schrittweise entwickelst, musst du jedes Mal die Prodecure/Function löschen und neu anlegen (lassen). Aber das kannst du ja in der Workbench als eine Reihe von Statements niederschreiben:

        DROP PROCEDURE IF EXISTS name;
        delimiter //
        CREATE PROCEDURE name (evtl. parameter)
        BEGIN
          foo;
          bar;
        END//
        delimiter ;
        CALL name(evtl. parameter);

        dedlfix.

        1. Tach!

          Auch!

          Ich antworte nur nicht, weil ich zu viel nachlesen muß.

          Ich melde mich dann aber wieder hier...