Entweder / Oder

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

  • Entweder / Oder

    Servus die Damen und Herren,

    ich hab da mal ein kleines SQL Problem zu lösen. Basic ist MySQL 5.0

    Ich habe folgende Tabellen:

    bars
    bar_id
    viele unwichtige Felder.....

    funfairs
    funfair_id
    viele unwichtige Felder.....

    und als letzte:

    photos
    photo_id
    photo_objektid -> ist entweder eine bar_id, oder eine funfair_id
    photo_category -> entweder steht dort "bars" oder "funfairs" drin, deutet also auf den Typ

    Anhand der Kombination von photo_objektid und photo_category kann ich also auf einen Eintrag aus oben genannten Tabellen schließen.

    Ich möchte jetzt 5 zufällige Fotos die in die Tabelle photos eingetragen wurden, MIT ihren Objectdaten, also dem passenden Ergebnisset aus bars oder funfairs.

    Versuch:


    PHP-Code:
            $strSql 'SELECT    * '
                    
    'FROM     photos Photos, bars Bars, funfairs Funfairs '
                    
    'WHERE    photo_status > 0 '
                    
    'AND        ( photo_objektid = Bars.bar_id '
                    
    '                AND Photos.photo_kategorie = "bars") '
                    
    'OR        ( photo_objektid = Funfairs.funfair_id '
                    
    '                AND Photos.photo_kategorie = "funfairs" ) '
                    
    'ORDER BY    RAND() '
                    
    'LIMIT    5'
    Das Problem ist, das ich so für ein Foto neben einer Bar, auch Funfair Daten zurückbekomme.

    Hat jemand nen Tipp?

    Ein Dump zum rumspielen befindet sich im Anhang.

    Gruß

    Schnoop
    Angehängte Dateien

  • #2
    WHERE 1 AND (2 AND 3) OR (4 AND 5)
    AND bindet stärker als OR sprich ohne weiteren Klammern wird daraus
    WHERE (1 AND (2 AND 3)) OR (4 AND 5)

    übrigens schlage ich eine Struktur-Änderung vor:
    photos
    photo_id
    bar_id DEFAULT NULL
    funfair_id DEFAULT NULL
    statt beide ID-Typen in eine Spalte zu mergen.

    Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

    bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
    Wie man Fragen richtig stellt

    Kommentar


    • #3
      Hm, bringt mir leider nicht viel. Ich hab die Strukturänderung vorgenommen, allerdings bekomm ich immer noch 3 Ergebnissets obwohl nur ein Photo in der DB steht. Das Problem ist das ich ja im Statement alle 3 Tabellen brauche für den Fall das es für beide Typen Fotos gibt. Und dadurch bekomme ich alle vorhandenen Fahrgeschäfte(in diesem Fall 3) auch zurück.

      Kommentar


      • #4
        Hast du den ersten Teil vom Posting bzgl. Where-Klausel auch berücksichtigt?

        Wenn ja poste mal den aktuellen Query, sonst kann man nur raten was du machst.

        Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

        bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
        Wie man Fragen richtig stellt

        Kommentar


        • #5
          PHP-Code:
                  $strSql 'SELECT    * '
                          
          'FROM     photos Photos, bars Bars, funfairs Funfairs '
                          
          'WHERE    photo_status > 0 '
                          
          'AND        ( '
                          
          '                    photo_barid = Bars.bar_id '
                          
          '                    OR '
                          
          '                    Photos.photo_funfairid = Funfairs.funfair_id '
                          
          '            ) '
                          
          'LIMIT    5'

          Kommentar


          • #6
            Okay nach ghostgambler 's Beispiel mach daraus einfach:
            PHP-Code:
            $sql "
                SELECT 
                    * 
                FROM 
                    photos Photos, 
                    bars Bars, 
                    funfairs Funfairs 
                WHERE 
                    (photo_status > 0 AND 
                        (
                            photo_barid = Bars.bar_id
                           )
                    ) OR (
                        Photos.photo_funfairid = Funfairs.funfair_id
                    )
                LIMIT
                    0, 5
            "

            Ein wenig gesplittet angezeigt, damit das mit den Klammern nachvollzogen werden kann.
            MM Newmedia | MeinBlog

            Kommentar


            • #7
              also ein join mit OR wird dir immer ein Produkt im resultset geben. Du könntest über UNION gehen dann wird das Ergebnis korrekt ausfallen
              Beantworte nie Threads mit mehr als 15 followups...
              Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

              Kommentar


              • #8
                Immer noch falsch. Und Union ist mit Kanonen auf Spatzen.

                Code:
                	SELECT 
                		* 
                	FROM 
                		photos
                	LEFT JOIN
                		bars
                		ON photo_barid IS NOT NULL AND photo_barid = fars.bar_id
                	LEFT JOIN
                		funfairs
                		ON photo_funfairid IS NOT NULL AND photo_funfairid = funfairs.funfair_id
                	WHERE 
                		photo_status > 0
                	ORDER BY RAND()
                	LIMIT 0, 5
                ORDER BY RAND() ist übrigens auch eher schlecht. Aber das scheint ja eh ein Anfänger-Skript zu sein, das geht dann wohl zu tief...

                Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                Wie man Fragen richtig stellt

                Kommentar

                Lädt...
                X