Announcement

Collapse
No announcement yet.

Update, Zählen und gleichzeitiges Berechnen - 2012

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Update, Zählen und gleichzeitiges Berechnen - 2012

    Hallo Zusammen,
    vielleicht kann mir jemand von euch bei meinem aktuellen Problem helfen!? Die Frage wurde vor 4 Jahren schonmal gepostet, allerdings ohne Ergebnis...

    Es geht um eine SQL-Datenbank mit mehreren Tabellen, bezüglich meines Problems sind allerdings nur zwei Tabellen betroffen. Aus diesem Grund werde ich auch nur diese Tabellen ansprechen. Der Vollständigkeit wegen erwähne ich noch die Tabelle Kunde, da diese in Zusammenhang mit der Tabelle Newsletter steht.

    Es existiert folgende Fragestellung/Problem:
    In der Tabelle „Anzeigen“ soll geprüft werden ob eine Anzeige im Feld „aktuell“ auf „0“ bzw. „1“ steht, also ob die Anzeige noch aktuell ist oder nicht.
    Wenn die Anzeige bereits ABGELAUFEN ist, also auf „0“ steht soll folgender Schritt unternommen werden:
    In der Tabelle „Newsletter_Versand“ soll gezählt werden, wie oft eine bestimmte „ID“ aus der Tabelle „Anzeigen“ eingetragen ist, die nicht mehr aktuell ist.
    Dieser Wert soll dann an den entsprechenden Datensatz in der Tabelle „Anzeigen“ in das Feld „Newsletter_Kunde“ übergeben werden, sodass man sehen kann wie oft eine bereits abgelaufene Anzeige versendet wurde.
    Ist bei „Newsletter_an_Kunde“ aber bereits ein höherer Wert als ‚0‘ eingetragen, also ist die Anzeige zuvor schon mehrfach versendet worden, sollen sich die beiden Werte summieren und dann das entsprechende Feld aktualisieren.


    Tabellenstruktur:

    Tabelle 1 (Anzeigen):
    • Bezeichnung: Anzeigen
    • Diese Tabelle enthält die Stellenanzeigen.
    • Die zwei relevanten Felder sind „aktuell“ und „Newsletter_an_Kunde
    • aktuell: Boolscher Wert (Ja/Nein): 0 = offline (Wird nicht mehr angezeigt in Suche) / -1 = online (wird angezeigt in Suche)
    • Newsletter_Kunde: (Integer): Enthält die Summe der verschickten Job_Finder, also die Gesamtanzahl der UNTERSCHIEDLICHEN Adressdaten.

    Felder:
    • ID (Primärschlüssel)
    aktuell
    • Aufnahmedatum
    Newsletter_an_Kunde
    • Name
    • Ansprechpartner
    • Abteilung
    • Usw.


    Tabelle 2 (Newsletter_Versand):
    • Bezeichnung: Newsletter_Versand
    • Diese Tabelle stellt eine komplex/komplexe Beziehung da und muss daher als eigenständige Tabelle erzeugt werden. Diese Tabelle wird herangezogen, wenn Newsletter verschickt werden.
    • IdAnzeigen: Dieses Feld hat die entsprechenden Werte aus dem Feld ID aus der Tabelle „Anzeigen“
    • idKunde: Dieses Feld hat die entsprechenden Werte aus dem Feld ID aus der Tabelle „Kunde“
    • Der Sinn dieser Beziehungstabelle ist es zu sehen, welche Stellenanzeigen an bestimmte Bewerber bereits verschickt wurden und ermöglicht so eine Zählung (Summenberechnung).

    Felder:
    • Id (Primärschlüssel)
    • idAnzeigen (Fremdschlüssel auf Tabelle: Anzeigen)
    • idKunde (Fremdschlüssel auf Tabelle: Kunde)


    Tabelle 3 (Kunde):
    • Bezeichnung: Kunde
    • Die Tabelle Kunde enthält die Datensätze zu den einzelnen Kunden.

    Felder:
    • ID (Primärschlüssel)
    • Name
    • Vorname
    • Abteilung
    • Strasse
    • PLZ/Ort
    • Telefon
    • Usw.

    ------------------------------------------------------------------------------------------------------------

    Um mir die entsprechenden Werte in einer, zur Ansicht erzeugten, Spalte ausgeben zu lassen habe ich folgende zwei Abfragen erstellt:


    Abfrage A mit INNER JOIN:
    [highlight=sql]
    SELECT Anzeigen.ID, COUNT(Anzeigen.ID) AS NEWSLETTER
    FROM Anzeigen
    INNER JOIN Newsletter_Versand
    ON (Anzeigen.ID=Newsletter_Versand.idAnzeigen)
    WHERE Anzeigen.aktuell=0
    GROUP BY Anzeigen.ID
    ORDER BY Anzeigen.ID;
    [/highlight]


    Abfrage B mit LEFT JOIN:

    [highlight=sql]
    SELECT Anzeigen.ID, COUNT(Newsletter_Versand.idAnzeigen) AS NEWSLETTER
    FROM id_jobfinder_angebote
    LEFT JOIN Anzeigen
    ON (Newsletter_Versand.idAnzeigen=Anzeige.ID)
    WHERE Anzeigen.aktuell=0
    GROUP BY Newsletter_Versand.idAnzeigen
    ORDER BY Newsletter_Versand.idAnzeigen;
    [/highlight]

    Daraus habe ich versucht eine Update-Funktion zu erstellen, die auch tatsächlich die entsprechenden Werte ersetzt, leider aber auch einfach die alten Werte bei Anzeigen/Newsletter_an_Kunde überschrieben hat.
    Und eigentlich war es auch mehr Zufall, dass die Abfrage die richtigen Rows erwischt hat.


    Wie kann ich aus diesen Abfragen eine Funktion machen?
    [highlight=sql]UPDATE ...... SET ...... = [/highlight]

    Bitte um Hilfe, steh jetzt echt vor der Wand....
    Sorry für den langen Text, aber ich dachte, dass es ausführlicher vielleicht leichter verständlich ist....
    Zuletzt editiert von domistyler; 19.10.2012, 10:03.
    Viele Grüße
    Domistyler

  • #2
    So, habs rausgefunden... Musste mit einer Prozedur erledigt werden!

    Falls jemand drüber nachgedacht hat - Trotzdem Vielen Dank
    Viele Grüße
    Domistyler

    Comment


    • #3
      Ich weiss zwar nicht wie du es gemacht hast aber eine weniger bekannte Variante für ein UPDATE sieht so aus:
      [highlight=sql]
      UPDATE
      (SELECT Anzeigen.ID
      FROM id_jobfinder_angebote
      LEFT JOIN Anzeigen ON (Newsletter_Versand.idAnzeigen=Anzeige.ID)
      WHERE Anzeigen.aktuell=0)
      SET ID = ....
      [/highlight]

      Ob diese Variante überall funktioniert weiss ich nicht, ich kenne (fast) nur Oracle.
      Für das innere SELECT gibt es natürlich ein paar Bedingungen, die Dokumentation hilft dir da bestimmt weiter.

      Gruss

      Comment


      • #4
        Hallo Wernfried,

        vielen Dank für deine Antwort!
        Habs auf diese Weise auch schon versucht. Das Problem war aber die Ergebnismenge, die musste weiterverarbeitet werden. Und so funktionierts :

        [highlight=sql]
        DELIMITER $$
        CREATE DEFINER=`NAME`@`%` PROCEDURE `Update_Newsletter`()
        BEGIN
        DECLARE anzeigenid, newsletter_alt, anzahl, done1 INT DEFAULT 0;
        DECLARE cursor_bezeichnung CURSOR FOR SELECT ANZEIGEN.ID, Newsletter_an_Kunde, COUNT(Newsletter_Versand.idAnzeigen)
        FROM ANZEIGEN
        INNER JOIN Newsletter_Versand
        ON (ANZEIGEN.ID=Newsletter_Versand.idANZEIGEN)
        WHERE ANZEIGEN.aktuell=0
        GROUP BY ANZEIGEN.ID
        ORDER BY ANZEIGEN.ID;

        DECLARE CONTINUE HANDLER FOR NOT FOUND SET done1 = 1;
        OPEN cursor1;
        FETCH NEXT FROM cursor1 INTO anzeigenid, newsletter_alt, anzahl;
        WHILE NOT done1 DO
        UPDATE ANZEIGEN SET ANZEIGEN.Newsletter = (newsletter_alt+anzahl) WHERE anzeigen.id = anzeigenid;
        DELETE FROM Newsletter_Versand WHERE Newsletter_Versand.idAnzeigen = anzeigenid;
        FETCH cursor1 INTO anzeigenid, newsletter_alt, anzahl;
        END WHILE;
        CLOSE cursor1;
        END;
        [/highlight]
        Zuletzt editiert von domistyler; 19.10.2012, 10:01.
        Viele Grüße
        Domistyler

        Comment

        Working...
        X