2 mal joinen

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

  • 2 mal joinen

    Hallo
    Dies ist mein erster Post hier, und dann gleich was komplexes Der Thementitel verrät nicht allzuviel, aber das kann man nicht gut abkürzen, also ich code grade an einem PHP/MySQL Forum und will bei der Themenansicht (wo man alle Themen in einem Forum ansehen kann) in einem Statement:
    1. Alle Werte aus der bb_topics Tabelle auslesen
    2. Den Namen des Erstellers aus der bb_members Tabelle auslesen
    3. Den Namen des Erstellers des letzten Posts rauskriegen (ebenfalls aus bb_members)

    Alles in einem Statement. Erstmal, geht das überhaupt?
    Ich habe mit meinen mickrigen Kenntnissen über JOIN Kommandos mal das hier fabriziert, funktioniert gar nicht mal so schlecht, nur wird hier 2 mal derselbe Name für den Ersteller und den letzten Poster erkannt:

    SELECT
    bb_topics.*,
    bb_members.name AS creator_name,
    bb_members.name AS lastpost_creator_name
    FROM bb_topics
    LEFT JOIN bb_members AS t_creator ON bb_topics.creator=t_creator.id
    LEFT JOIN bb_members ON bb_topics.lastpost_creator=bb_members.id
    WHERE area_id='1' ORDER BY priority DESC, lastpost_time DESC

    Das Forum sieht schon ziemlich gut aus udn hat schon recht viele Funktionen, ich bin grade nur noch am optimieren dun da kann ich mir 2 Datenbankaufrufe pro Topic sparen, wenn ich das in einem Statement mache.

  • #2
    Re: 2 mal joinen

    - erstmal lass die "AS" weg, die sind unnötig und nicht ANSI konform
    - dann macht man keine "select * "-Abfragen, das kostet Performance. Selektiere genau die Spalten die du brauchst
    - ON Klauseln werden in Klammern geschrieben
    - du solltest bei jedem Feld den voll qualifizierten Namen nehmen, das erspart die Fehlersuche bei späterer Erweiterung der Abfrage und dann doppelt vorkommenden Feldnamen
    - wenn area_id ein numerischen Feld ist, entfernen die Hochkommata
    Code:
    SELECT 
       bb_topics.*,
       bb_members.name creator_name,
       bb_members.name lastpost_creator_name
    FROM bb_topics 
    LEFT JOIN bb_members t_creator ON ( bb_topics.creator=t_creator.id )
    LEFT JOIN bb_members ON ( bb_topics.lastpost_creator=bb_members.id )
    WHERE area_id='1' 
    ORDER BY priority DESC, lastpost_time DESC
    TBT

    Die zwei wichtigsten Regeln für eine berufliche Karriere:
    1. Verrate niemals alles was du weißt!


    PHP 2 AllPatrizier II Browsergame

    Kommentar


    • #3
      Erstmal vielen Dank für die guten Tipps. Beim optimieren benötige ich gerade so etwas, um alles schneller und kompatibler zu machen. Das select * ist normal nicht gut, ok, jedoch will ich in diesem Falle wirklich alle Werte aus der Tabelle haben, denn später will ich wirklich alle anzeigen

      Zu dem hier:

      - du solltest bei jedem Feld den voll qualifizierten Namen nehmen, das erspart die Fehlersuche bei späterer Erweiterung der Abfrage und dann doppelt vorkommenden Feldnamen

      Das versteh ich nicht ganz.

      - wenn area_id ein numerischen Feld ist, entfernen die Hochkommata

      Aber es ist doch eigentlich egal oder?

      Und: Mein Problem wurde leider nicht gelöst, es werden weiterhin als creator_name und lastpost_creator_name dieselben Namen angezeigt.

      Kommentar


      • #4
        deswegen immer auch den vollen Name also Tabelle.Spalte

        Code:
        SELECT 
           bb_topics.*,
           [color=red]t_creator[/color].name creator_name,
           [color=green]t_answer[/color].name lastpost_creator_name
        FROM bb_topics 
        LEFT JOIN bb_members [color=red]t_creator[/color] ON ( bb_topics.creator=[color=red]t_creator[/color].id )
        LEFT JOIN bb_members [color=green]t_answer[/color] ON ( bb_topics.lastpost_creator=[color=green]t_answer[/color].id )
        WHERE area_id=1 
        ORDER BY priority DESC, lastpost_time DESC
        du hast ja auch 2 mal bb_members.name abgefragt.

        zu der area_id:

        '1' ist ein String, wenn area_id eine Zahl ist, muß MySQL das erst umwandeln, und dies dauert Zeit

        genauso bei Joins: beide Felder in einem Join sollten den selben Datentyp haben, genau den selben.
        Ansonsten erfolgt intern erst ein cast, welcher Zeit kostet
        TBT

        Die zwei wichtigsten Regeln für eine berufliche Karriere:
        1. Verrate niemals alles was du weißt!


        PHP 2 AllPatrizier II Browsergame

        Kommentar


        • #5
          Es funktioniert, großes Dankeschön!
          Auch danke für die Erklärung, wusste gar nicht, dass die Datentypen dann umgewandelt werden.

          Kommentar

          Lädt...
          X