Join unter bestimmter bedingung ausführen?

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Join unter bestimmter bedingung ausführen?

    Hallo,

    ich habe ein kleines Problem, bei dem ich mal die Hilfe von Profis benötige. Möglicherweise ist, was ich vorhabe auch gar nicht möglich.

    Ich stelle über ein PHP-Skript eine MySQL-Anfrage, in der ein INNER JOIN vorkommt.
    Dieser INNER JOIN soll aber nur ausgeführt werden, wenn er auch möglich ist, d.h. wenn in der ON-Clause genannten Felder auch gefüllt sind.

    Vielleicht erstmal den Code, dann ist einfacher ?!

    PHP-Code:
    SELECT a.aktionID,a.kundenID,a.max_klick,a.max_viewa.eigen
        FROM aktion a
        
        INNER JOIN kunden_konto k ON a
    .kundenID=k.kundenID
          
    AND (k.klick>='1' or a.eigen='1')
          AND (
    k.view>='1' or a.eigen='1')

        
    INNER JOIN stat_aktion sa ON a.aktionID=sa.aktionID
          
    AND (sa.klick a.max_klick or a.max_klick='-1')
          AND (
    sa.view a.max_view or a.max_view='-1')
          AND 
    sa.date='2006-08-30'

        
    AND a.aktiv='1'
        
    ORDER BY rand()
        
    LIMIT 0,
    die Tabelle stat_aktion ist eine Statistik-Tabelle. Es kann vorkommen, daß für die Spalte sa.date am 2006-08-30 noch gar kein Eintrag vorgenommen, in diesem Falle wird bei dem jetzigen Skript kein Ergebnis ausgegeben.

    Was möchte ich erreichen?
    dieser Join
    PHP-Code:
    INNER JOIN stat_aktion sa ON a.aktionID=sa.aktionID
          
    AND (sa.klick a.max_klick or a.max_klick='-1')
          AND (
    sa.view a.max_view or a.max_view='-1')
          AND 
    sa.date='2006-08-30' 
    soll nur teil der Abfrage sein, wenn es auch einen eintrag in der Tabelle stat_aktion am 2006-08-30 mit der entsprechenden a.aktionID gibt.
    Gibt es diesen Eintrag nicht soll dieser Join nicht bestandteil der Abfrage sein.

    Eine zusätzliche Abfrage im Vorfeld ist hier aufgrund der komplexität nicht möglich.

    Ich bin über jeden Tipp sehr dankbar

    Atze

  • #2
    mache auch einem INNER JOIN ein LEFT JOIN und füge WHERE sa.irgendwas IS NULL hinzu.

    Kommentar


    • #3
      Moin asp2php,

      danke für die Antwort. Muss ich wirklich "WHERE" benutzen und nicht "AND"?
      Wenn ich "WHERE" benutzen soll, an welche Stelle muss ich dieses ein setzen?


      Atze

      Kommentar


      • #4
        O.k.
        jetzt sieht der Code so aus:
        PHP-Code:
        SELECT a.aktionID,a.kundenID,a.max_klick,a.max_viewa.eigen
            FROM aktion a
            
            INNER JOIN kunden_konto k ON a
        .kundenID=k.kundenID
              
        AND (k.klick>='1' or a.eigen='1')
              AND (
        k.view>='1' or a.eigen='1')

           AND 
        a.aktiv='1'
         
           
        LEFT JOIN stat_aktion sa ON a.aktionID=sa.aktionID
              
        AND (sa.klick a.max_klick or a.max_klick='-1')
              AND (
        sa.view a.max_view or a.max_view='-1')
              AND 
        sa.date='2006-08-30'
             
        WHERE sa.date IS NULL
            
            ORDER BY rand
        ()
            
        LIMIT 0,
        Jetzt ist zwar so, daß ich ein Ergebniss bekomme, wenn sa.date NULL ist.
        Wenn sa.date allerdings schon einen Wert hat, dann bekomme ich kein Ergebnis.

        Mein Ziel ist es allerdings, in beiden Fällen ein Ergebnis zu bekommen. Wenn also sa.date NULL ist soll der JOIN
        PHP-Code:
           LEFT JOIN stat_aktion sa ON a.aktionID=sa.aktionID
              
        AND (sa.klick a.max_klick or a.max_klick='-1')
              AND (
        sa.view a.max_view or a.max_view='-1')
              AND 
        sa.date='2006-08-30' 
        nicht ausgeführt werden!
        Wenn sa.date <> NULL ist soll der JOIN aus geführt werden.

        Bitte Hilfe.
        Atze

        Kommentar


        • #5
          Und wenn du das WHERE einfach rausnimmst?
          Ich denke, also bin ich. - Einige sind trotzdem...

          Kommentar


          • #6
            @atzemann, Sorry, soll natürlich

            ... WHERE NOT sa.whatever IS NULL

            somit filterst du die Ausgabe und bekommst nur noch Daten, wo sa.date<>NULL ist

            Kommentar


            • #7
              Hi,

              ich habe mittlerweile schon viele Varianten durchprobiert. Auch die von Dir genannte. Ich habe auch schon viele Foren durch.

              Das Problem ist eben, daß scheinbar sa.blabla einen Wert gespeichert haben muss, damit alles so funktioniert, wie es meinem kranken Hirn entsprung ist.
              Ich habe aufgegeben <= also das Skript läuft mittlerweile. Ich habe jetzt nur zwei zusätzliche Datenbankabfragen im Vorfeld laufen, die prüfen welche Werte sa.blabla hat und fügt dann die fehlenden Werte ein.
              Schade ich wollte eigentlich zusätzlich Abfragen sparen, weil in dem Skript schon sehr viele drin sind und dieses Skript sehr sehr sehr oft laufen wird.

              Vielleicht kann ich noch ein paar Abfragen sparen, wenn ich ein paar Datenbankabfragen in Dateien auslager - obwohl ich das immer sehr beknackt finde.

              Danke für Deine Hilfe, die zwar zur Lösung des Problemes geholfen hat, durch die ich aber wieder etwas gelernt habe.

              Atze

              Kommentar


              • #8
                und wenn du das ganze über eine procedure machst?
                dann hast du zwar in der procedure auch mehrere anfragen (2 um genau zu sein), aber du bleibst auf dem server.
                zurzeit holst du ja erst einen ergebnissatz, wertest den mit php aus und schickst dann wieder eine sql anfrage oder?
                mit einer procedure würdest die ganze zeit auf dem sql server bleiben bei 1 anfrage (natürlich 2 select anfragen in der procedure selbst)
                weiß nich ob dir das weiterhilft

                Kommentar


                • #9
                  @honki && OP

                  perfomancemäßig ist das auf jedenfalll ein gewinn. Die procedures
                  werden "kompiliert" und optimiert auf dem server gespeichert.
                  D.h. der teuere optimierungsvorgang fällt bei vielen abfragen nicht
                  mehr an. Ausserdem verkleinert sich dadurch deine schnittstelle.

                  Problematisch generell ist ob es sinnvoll ist logik in der db abzulegen.
                  Da scheiden sich die geister.


                  greets
                  (((call/cc call/cc) (lambda (x) x)) "Scheme just rocks! and Ruby is magic!")

                  Kommentar


                  • #10
                    ich weiß dass sybase und oracle und so cached, aber auch mysql?
                    das wäre ja wahnsinn ^^
                    aber der cache wird ja nur angewandt, wenn der befehl nahezu identisch ist. hab schon gehört, dass es wegen "zuvielen" leerzeichen manchma nicht als gecachter befehl erkannt wird

                    Kommentar

                    Lädt...
                    X