Kleines LEFT JOIN Problem

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

  • Kleines LEFT JOIN Problem

    Hallo,

    diese Abfrage frägt alle Leute ab die gerade online sind und zeigt alle Freunde von User "1" an:

    PHP-Code:
    SELECT

    userid
    usernametable_orte_de.ortname AS city,table_orte_de.plz AS plz

    FROM

    table_stammdaten

    LEFT JOIN

    table_orte_de

    ON

    table_stammdaten
    .ortid=table_orte_de.ortid

    WHERE

    userid

    IN
    (SELECT fuer FROM table_kontakte WHERE von=AND art='freunde')

    AND

    userid

    IN
    (SELECT von FROM table_kontakte WHERE fuer=AND art='freunde' AND sichtbar='ja')

    AND

    freigeschaltet='ja'

    ORDER BY

    username

    ASC 
    Das zeigt den normalen Usernamen an (username), die User können aber allen Freunden eigene Namen vergeben (table_kontakte.spitzname).

    Wie kann ich jz mittels zusätzlichen LEFT JOIN auch den Spitznamen ausgeben lassen sofern dieser existiert?

  • #2
    IFNULL()
    INFO: Erst suchen, dann posten![color=red] | [/color]MANUAL(s): PHP | MySQL | HTML/JS/CSS[color=red] | [/color]NICE: GNOME Do | TESTS: Gästebuch[color=red] | [/color]IM: Jabber.org |


    Kommentar


    • #3
      Hallo,

      ersteinmal würde ich dir empfehlen, die Typen der Felder "Freigeschaltet" und "Sichtbar" zu ändern. Statt dort als String 'ja' und 'nein' zu speichern macht es wahrscheinlich viel mehr Sinn, das Feld als BOOL (Alias zu Tinyint(1)) zu definieren und in das Feld eine 1 oder eine 0 zu schreiben.

      Mit dem Spitznamen, da machst du einfach einen weiteren Left-Join. Da wird er ja nur angegeben, wenn der Spitzname da ist, ansonsten gibts ja ein NULL zurück.
      signed oder unsigned... das ist hier die Frage

      Kommentar


      • #4
        Die Infos sind ein wenig dürftig, aber grundsätzlich sollte das ja kein Problem sein. Ich poste jetzt die Abfrage, allerdings mehr um zu zeigen, dass man solche auch lesbar formatieren kann:
        PHP-Code:
        SELECT
            s
        .userid,
            
        s.username
            
        o.ortname AS city,
            
        o.plz AS plz,
            
        k.spitzname
        FROM
            table_stammdaten s
        LEFT JOIN
            table_orte_de o USING
        (ortid)
        LEFT JOIN
            table_kontakte k USING
        (userid)
        WHERE
            userid IN
        (
                
        SELECT 
                    fuer 
                FROM 
                    table_kontakte
                WHERE 
                    von 

                
        AND 
                    
        art 'freunde'
            
        )
        AND
            
        userid IN(
                
        SELECT 
                    von 
                FROM 
                    table_kontakte 
                WHERE 
                    fuer 

                
        AND 
                    
        art 'freunde' 
                
        AND 
                    
        sichtbar 'ja'
            
        )
        AND
            
        freigeschaltet='ja'
        ORDER BY
            username

        Ich bin mir allerdings fast sicher, dass man die Abfrage noch vereinfachen könnte, aber siehe oben ...
        Gruss
        H2O

        Kommentar


        • #5
          Original geschrieben von case
          ersteinmal würde ich dir empfehlen, die Typen der Felder "Freigeschaltet" und "Sichtbar" zu ändern. Statt dort als String 'ja' und 'nein' zu speichern macht es wahrscheinlich viel mehr Sinn, das Feld als BOOL (Alias zu Tinyint(1)) zu definieren und in das Feld eine 1 oder eine 0 zu schreiben.
          Ist ENUM und kein VARCHAR, Speicherverbrauch genau wie TINYINT nur 1 Byte.

          @H2O:

          Hm da liefert mir "Unknown column 'userid' in 'from clause'" zurück...

          Mal hier die Tabellen etwas ausführlicher:

          table_stammdaten:

          - userid
          - username
          - ortid
          - freigeschaltet

          table_orte_de:

          - ortid
          - plz

          table_kontakte:

          - von
          - fuer
          - art (freunde/ignore)
          - sichtbar (invisible)
          - spitzname

          Die Abfrage muss auch nicht 100% optimiert sein und so ultrakurz wie möglich... ich als Non-Profi kann ansonsten ja kaum später daran noch was ändern...

          Kommentar


          • #6
            Also gibt es keine offensichtliche Verbindung zwischen Stammdaten und Kontakte. Da ist die Abfrage auf den Spitznamen so nicht möglich.
            Ansonsten häng halt mal noch den Stammdaten-Alias (s.) vor die beiden Userid's in der WHERE-Klausel.
            Gruss
            H2O

            Kommentar


            • #7
              Ja ist etwas verzwickter als ich dachte...

              Ablauf des Query ist ja derzeit so:

              Ich (userid 1) bin online und will wissen welche Freunde noch online sind:

              1) Abfrage aus den Stammdaten wer online ist

              (das liefert z.B. 50 Leute zurück)

              2) Abfrage wer von den 50 Leuten in meinen Kontakten als Freund drin ist

              (das liefert z.B. 5 Leute zurück)

              Ich glaube ich muss die Tabellen anders aufbauen...

              Kommentar


              • #8
                Original geschrieben von Truncate
                Ich glaube ich muss die Tabellen anders aufbauen...
                Oder mindestens die Abfrage. Wenn ich davon ausgehe, dass in der Kontakt-Tabelle in von dien Id und in fuer diejenige deiner Feunde steht, dann würde ich in dem Fall das etwa so aufbauen:
                PHP-Code:
                SELECT
                    s
                .userid,
                    
                s.username
                    
                o.ortname AS city,
                    
                o.plz AS plz,
                    
                k.spitzname
                FROM
                    table_kontakte k
                INNER JOIN
                    table_stammdaten s ON k
                .fuer s.userid
                LEFT JOIN
                    table_orte_de o USING
                (ortid)
                WHERE
                    k
                .von $meine_id
                AND
                    
                k.sichtbar 'ja'
                AND
                    
                k.art 'freunde'
                AND
                    
                s.freigeschaltet 'ja'
                Ist nicht getestet, also schau, falls Fehler drin sind zuerst selber mal nach, bevor du ungesehen den Fehler wieder postest.
                Gruss
                H2O

                Kommentar


                • #9
                  Danke das hilft mir schon mal weiter.

                  Meine userid "1" muss allerdings 2-fach vorhanden sein, da ich ja User "2" in meiner Freundeliste habe und er mich auch:

                  von|fuer|art
                  1;2;freunde
                  2;1;freunde
                  ...

                  Deine letzte Variante listet ja "nur" alle Leute auf, welche ICH in meiner Liste als Freunde habe (allerdings prüft es nicht ob diese Leute mich auch in der Liste als Freund haben).

                  Tabellen müssen wohl doch anders aufgebaut werden für diese Abfragen...

                  Kommentar

                  Lädt...
                  X