Kniffliges MySQL Problem

  • Hello Leute,

    ich habe hier einen etwas kniffligen Denkanstoß für alle Pros unter Euch was MySQL Querys betrifft. Ich glaub ich bin grade etwas zu betrunken um das Problem in den Griff zu kriegen.

    Also folgendes:

    Ich habe 3 Tabellen:

    FRIENDS
    USERS
    TALKS

    Talks speichert Postings ab, die ausgegeben werden sollen.
    Users speichert Benutzerdaten ab, ganz normal.
    Friends speichert virtuelle Freunschaften zwischen zwei oder mehreren Benutzern ab.

    Ich habe einige Einträge in der Tabelle Talks und drei Benutzer.

    Benutzer ID 1 und 2 sind mit der Datenbank Friends miteinander verbunden:

    FRIEND_ID | USER_ID | USER_FRIEND_ID
    1 | 1 | 2

    Friend id ist eine Auto-Increment Variable
    User Id ist die Id des Benutzers der die Freundschaftsanfrage gestellt hat
    User Friend Id ist die Id des anderen nutzers der die Anfrage akzeptiert hat

    So nun will ich, dass alle Einträge aus TALKS die Nutzer 1 und 2 schreiben bei beiden ausgegeben werden. Bei benutzer 3 jedoch nicht, da der mit niemand befreundet ist...

    habe es bis dahin gebracht:

    SELECT t.*, u.user_firstname, u.user_lastname FROM talks AS t, users AS u, friends AS f WHERE (u.user_id = '$uid' AND u.user_id = t.user_id) OR (u.user_id = f.user_id AND f.user_id = t.user_id) OR (u.user_id = f.user_friend_id AND f.user_friend_id = t.user_id) ORDER BY t.talk_time DESC LIMIT $entry_count

    Bei Benutzer 1 und 2 wird auch alles richtig angezeigt nur benutzer 3 (der zu garkeinen der beiden eine verbidnung hat) werden alle einträge angezeigt + die eigenen

    Hat jemand von euch eine Lösung dieses Problems.

    Ricgtunge Datenbank Queries zu schrieben ist eindeutig mein Kryptonit.

    Lg
    Mathias

    PHP
    if(isset($this) || !isset($this)){ // that's the question...
  • Na dann warten wir doch heute erst mal noch ab, bis du ausgenüchtert bist und dann probierst es nochmal


    mfg

  • Ok Leute,

    ich hab mich nachdem ich nun wieder nüchtern bin wieder daran gewagt und bin soweit gekommen:

    SELECT t.user_id AS tuid, t.*, u.user_firstname, f.user_id AS F_USER_ID, f.user_friend_id AS F_USER_FRIEND_ID FROM
    talks AS t
    LEFT JOIN
    users AS u ON u.user_id = t.user_id
    LEFT JOIN
    friends AS f ON (f.user_id = $uid OR f.user_friend_id = $uid)
    WHERE
    t.user_id = f.user_friend_id

    dieser query findet zuverlässig allepostings von profilen mit denen man befreundet ist
    das problem ist nur, dass wenn ich auch alle eigenen einträge ausgeben will die so oft ausgegeben werden wie es freundes-verbindungen gibt

    tja soweit bin ich dann mal ^^

    brauche also immer noch hilfe

    Habe noch etwas dran bearbeitet und bin nun bei folgendem Code:

    SQL
    SELECT t.user_id, t.*, u.user_firstname, f.user_id AS F_USER_ID, f.user_friend_id AS F_USER_FRIEND_ID FROM
    talks AS t
    LEFT JOIN
    users AS u ON u.user_id = t.user_id
    LEFT JOIN
    friends AS f ON (f.user_id = $uid OR f.user_friend_id = $uid)
    WHERE
    t.user_id = f.user_id OR t.user_id = f.user_friend_id

    Da das ganze ein bisschen schwer zu beschreiben ist hab ich das ganze mal was var_dump ausgegeben, damit dass ev ein bisschen leichter nachzuvollziehen ist:

    das in meinem letzten posting beschriebene problem liegt bei ['F_USER_ID']

    wie man sieht wird der name "Mathias" 2 mal ausgegeben, der rest korrekt

    entfernt man nun "t.user_id = f.user_id OR" ganz unten werden die 2 "Mathias" einträge verschwinden
    entfernt man das "t.user_id = f.user_friend_id" werden nur mehr die zwei "Mathias" einträge stehen bleiben

    ich will es erreichen dass "Max" und "Mario" angezeigt werden und EINMAL "Mathias"

    Geschafft :)

    SQL
    SELECT t.user_id, t.*, u.user_firstname, f.user_id AS F_USER_ID, f.user_friend_id AS F_USER_FRIEND_ID FROM
    talks AS t
    LEFT JOIN
    users AS u ON u.user_id = t.user_id
    LEFT JOIN
    friends AS f ON (f.user_friend_id = t.user_id)
    WHERE
    t.user_id = $uid OR t.user_id = f.user_friend_id
    PHP
    if(isset($this) || !isset($this)){ // that's the question...

    Einmal editiert, zuletzt von Sweet_Angel (8. Dezember 2010 um 15:02)

  • Verdammt, zu früh gefreut ... es wird immer noch nicht richtig angezeigt ... bei user id 1 funktionierts aber bei 2 und 3 nicht mehr ...

    hat doch noch wer eine lösung ??

    EDIT:

    SOOO Leute, jetzt hab ichs aber ;-D

    SQL
    SELECT DISTINCT t.*, u.user_firstname FROM
    users AS u
    LEFT JOIN
    friends AS f
    ON
    (f.user_id = $uid OR f.user_friend_id = $uid)
    LEFT JOIN
    talks AS t ON (t.user_id = f.user_id OR t.user_id = f.user_friend_id OR t.user_id = $uid)
    WHERE
    u.user_id = t.user_id
    PHP
    if(isset($this) || !isset($this)){ // that's the question...

    Einmal editiert, zuletzt von Teron Gerofied (8. Dezember 2010 um 14:02)