kostenloser Webspace werbefrei: lima-city


komplizierte Datenbankabfrage

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    volnerius

    volnerius hat kostenlosen Webspace.

    Hallo liebes Forum,

    ich bin gerade am Ende meiner SQL/PHP Kentnisse angelangt und stehe vor einer großen Herausforderung.

    Es geht um 2 Tabellen: friendships und news
    friendships ist folgendermaßen aufgebaut: id | user1ID | user2ID und stellt die Freundschaft zwischen 2 Usern dar.
    news: id | userID | typeID in der Tabelle stehen News von Usern drinnen. UserID ist der User der die Neuigkeit geschrieben hat und typeID der Typ der Nachricht.

    Nun will ich eine Abfrage erstellen, die alle Ergebnisse aus der Tabelle news ausgibt, die von Freunden geschrieben wurden sind. Diese Freundschaften sind wie gesagt in der frienships Tabelle gespeichert, das Problem dabei ist, dass eine von diesen userID´s die eigene UserID, von dem User der zur Zeit online, ist und sich gerade die News durchliest. Aus diesem Grund kann ich kein einfaches
    WHERE news.userID = friendships.user1ID OR news.userID = friendships.user2ID
    machen. Ich weiß nun einfach nicht wie ich das allles hinkriege: Die Abfrage, welchee die Freunde von dem User sind, ob die user1ID oder die user2ID die ID des Freundes und dann noch die Abfrage aus der news Tabelle..

    Das ganze kann man sich wie die Neuigkeiten Seite auf Facebook vorstellen.


    Ich weiß das ist vielleicht nicht ganz so einfach zu verstehen, aber ich kann es leider einfach nicht besser in Wörter fassen.
    Vielen Dank für eure Antworten.
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Ich persönlich würde das mit PHP umsetzen. Zuerst liest du alle Freunde aus, dann deren geschriebene Nachrichten.

    Aber ich glaube, es gibt auch Möglichkeiten, mit einer einzigen Sql-Abfrage. Irgendwas mit Union Select hab ich noch im Hinterkopf, aber ich kann mich auch täuschen.
    Edit:
    Nein, es waren Unterabfragen.


    Ich zeige jetzt mal meine Abfrage, die wohl funktioniert. Es werden aber meiner Meinung nach alle Neuigkeiten in der Datenbank durchsucht, was die Abfrage bald schon sehr langsam machen könnte.
    SELECT userID, typeID FROM news
    WHERE (SELECT COUNT(*) FROM friendships
    WHERE (user1ID=77777 && user2ID=news.userID)
       || (user1ID=news.userID && user2ID=77777));

    An Stelle von 77777 (taucht 2mal auf) musst du die ID des aktuell angemeldeten Benutzers einsetzen.
    Aber wenn du sehr viele User bekommst, und nicht gerade jeder mit jedem befreundet ist, dann suche nach etwas besserem.

    Beitrag zuletzt geändert: 27.8.2014 20:02:46 von fuerderer
  4. Hallo erstmal..
    naja ich würde da du ja weißt welcher user gerade online ist

    .... AND NOT xxx.userid = $aktueller_user

    schreiben (dann musst du nur mehr darauf achten dass du die klammern richtig setzt )

    LG
  5. Hallo,

    bei der oben genannten Möglichkeit würde es vielleicht noch sinn machen via
    LIMIT die Anzahl zu begrenzen...

    alternativ könntest auch einen Join verwenden
    z.B. so in der art
    SELECT friendships.*, news.* FROM news JOIN friendships
    ON news.userid = friendships.userid2
    WHERE news.userid != '$aktueller_user' and friendships.userid1 = '$aktueller_user'
    ORDER BY datum desc 
    LIMIT 1,20;


    Gruß
    VA / Akashia
  6. akashia schrieb:
    SELECT friendships.*, news.* FROM news JOIN friendships
    ON news.userid = friendships.userid2
    [...]
    Wenn ich mich nicht irre, wird diese Anweisung fehlschlagen, weil friendships.userid2 keinen eindeutigen Index besitzt. Das heißt es kommen Duplikate in der Spalte vor.


    rglinitz schrieb:
    [...]
    ich würde da du ja weißt welcher user gerade online ist

    .... AND NOT xxx.userid = $aktueller_user

    schreiben
    So wie ich es beobachtet habe, reicht es wenn man nur die Beiträge der Freunde anzeigt.
    Die eigenen sind da nicht dabei, denn man ist ja nicht mit sich selbst befreundet.
    (zumindest nicht in der DB :wink:)
  7. karlsve

    Moderator Kostenloser Webspace von karlsve

    karlsve hat kostenlosen Webspace.

    Hallo volnerius,

    es schaut so aus als wolltest du sowas erreichen.

    Am einfachsten und effizientesten ist dies mit Joins zu erledigen.

    Allerdings bin ich mir nicht ganz sicher ob nur ein Eintrag oder zwei Eintrag (letzteres wäre sinnvoller) pro Freundschaft erstellt wird. Wenn nur ein Eintrag erstellt wird so musst du tatsächlich dies verwenden:
    akashia schrieb:
    Hallo,

    bei der oben genannten Möglichkeit würde es vielleicht noch sinn machen via
    LIMIT die Anzahl zu begrenzen...

    alternativ könntest auch einen Join verwenden
    z.B. so in der art
    SELECT friendships.*, news.* FROM news JOIN friendships
    ON news.userid = friendships.userid2
    WHERE news.userid != '$aktueller_user' and friendships.userid1 = '$aktueller_user'
    ORDER BY datum desc 
    LIMIT 1,20;


    Gruß
    VA / Akashia


    Wenn du jedoch zwei Einträge pro Freundschaft machst, dann ist die von mir verwendete Variante im SQLFiddle vermutlich für dich interessanter.

    Ich persönlich würde die zwei-Eintrag-Variante benutzen, da dadurch die SQL Abfrage einfacher wird. Es verdoppelt sich allerdings auch die Datenbankgröße logischerweise. Aber das ist deine persönliche Entscheidung.

    MfG
    karlsve
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!