[MySQL 4.1] Komplexe SQL-Query mit Rückführung

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

  • [MySQL 4.1] Komplexe SQL-Query mit Rückführung

    Hallo Leute,

    ich habe (wieder Mal) ein Problem mit einer SQL-Query und mir fiel leider auch (wieder Mal) kein passender Betreff ein. Ich schreibe zuerst die (vereinfachten) Tabellen-Strukturen:

    tbl_user:

    id, name, datum, ...

    tbl_fotos:

    u_id, id, ...

    tbl_favoriten:

    u1_id, u2_id

    Erklärung zur TBL_FAVORITEN:

    Ein User kann x andere User zu seinen Favoriten hinzufügen. Angenommen, der User mit der ID 1 fügt den User mit der ID 5 zu seinen Favoriten hinzu, sieht die Tabelle so aus:

    u1_id: 1
    u2_id: 5

    Der User kann sich alle seine Favoriten mit Foto anzeigen lassen (User ohne Foto(s) gibt es nicht). Das mache ich mit folgender Abfrage:

    SELECT
    user.id as uid, user.name, user.datum, foto.id as fid
    FROM
    tbl_favoriten fav
    JOIN
    tbl_user user ON user.id=fav.u2_id
    JOIN
    tbl_fotos foto ON user.id=foto.u_id
    WHERE
    fav.u1_id=1
    GROUP BY
    user.id

    (Die Gruppierung, weil jeder User, somit jeder Favorit, mehrere Fotos haben kann.)

    In diesem Fall würden mir also die Daten und das Foto vom User 5 angezeigt werden, wenn ich User 1 bin.

    Nun benötige ich jedoch noch eine zusätzliche Anzeige, ob mein Favorit (User 5) auch mich (User 1) in seinen Favoriten hat.

    Also angenommen, die Daten in der TBL_FAVORITEN sehen wie folgt aus:

    u1_id - u2_id
    1 - 5
    1 - 4
    5 - 1
    4 - 5

    Hier gibt es ein "Favoriten-Pärchen" bei User 1 und User 5, da sich beide gegenseitig in den Favoriten haben.

    Somit sollen mir die Daten von User 5 und User 4 angezeigt werden, bei User 5 soll jedoch noch der Hinweis erscheinen, dass dieser mich ebenfalls in seinen Favoriten hat.

    Leider weiß ich nicht, wie ich das machen soll, ohne für jeden User meiner Favoritenliste eine neue Abfrage zu starten, um zu prüfen, ob dieser mich in seinen Favoriten hat.

    Ich müsste ja theoretisch temporär eine zusätzliche Spalte einfügen, die speichert, ob eine Gegenseitigkeit besteht oder nicht. Doch leider fällt mir keinen Möglichkeit ein, um diese zusätzliche Informationsabfrage in dieses SQL-Statement einzufügen.

    Ich hoffe, ihr versteht überhaupt mein Problem, bzw. wie das Ergebnis aussehen soll. Noch mehr hoffe ich, dass ihr mir dann auch helfen könnt

    Ich bedanke mich schon im Vorraus,

    DasD

  • #2
    ab mysql 4.1 kannst du doch mit subselects arbeiten. hast du das schon einmal getestet?

    wobei ich mir auch zu 90% sicher bin, dass eine zweite query immer noch schneller ist, als viele JOINs und dann evtl noch ein subselect.
    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
      probiere mal:

      PHP-Code:
      select distinct 
          u
      .id my_id
          
      u.`namemy_name
          
      f.u2_id his_id
          
      p.id his_photo_id
          
      p1.id my_photo_of_his_fav_to_me 
      from
          
      ((tbl_user u inner join tbl_favoriten f on u.id=f.u1_id and u.id=1)
          
      inner join tbl_photo p on p.u_id=f.u2_id)
              
      left join tbl_favoriten f1 on f.u2_id=f1.u1_id and f1.u2_id=
                  left join tbl_photo p1 on f1
      .u2_id=p1.u_id 

      Kommentar


      • #4
        @Abraxax

        Ich weiß leider auch nicht, wie ich mit einem Subselect ans Ziel kommen sollte.
        Eine zweite Abfrage habe ich, nur finde ich das nicht besonders schön. Aber gut, wenn das tatsächlich performanter ist, dann bin ich damit glücklich. Zumindest, wenn du das so meinst, wie ich es habe:

        SELECT u1_id from tbl_favoriten where u2_id=1

        Das Ergebnis dann in ein Array und während der Ausgabe der einzelnen Favoriten wird geprüft, ob die User-ID des Favoriten im Array ist.

        @asp2php

        Ich blicke da zwar nicht wirklich durch, aber das sieht spannend aus *G*. Leider funktioniert es nicht. Das Ergebnis liefert mir jeden Favoriten mehrmals (so oft, wie viele Fotos jeder von ihnen hat), gibt die falschen Namen aus und verdreht etwas.

        Da ich trotz der vielen, schönen Hilfestellungen bzgl. JOINs noch zu dämlich bin, diese so richtig zu verstehen, weiß ich leider auch nicht, wie ich das ändern könnte.


        Ich bedanke mich bei euch und wünsche ein schönes Wochenende

        Kommentar


        • #5
          mach mal dumps von den 3 Tabellen mit Testdaten, damit ich mal probieren. Bitte nicht hierein posten, sondern als txt anhängen. Nur wenn noch Intresse besteht

          Kommentar

          Lädt...
          X