[SQL allgemein] Tabellen-Struktur für Buddyliste

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

  • [SQL allgemein] Tabellen-Struktur für Buddyliste

    Hi Leutz,

    hab mir vor einiger Zeit ne Buddyliste für mein CMS geschrieben und würde diese ganz gerne etwas ausbauen.
    Zur Zeit sieht das ganze so aus:

    MySQL-Tabelle buddys:

    id | userid | buddyid

    SQl-Abfrage:
    SELECT * FROM {$config['tables']['buddys']} AS b
    LEFT JOIN {$config['tables']['user']} AS u ON u.userid = b.buddyid
    WHERE b.userid = '{$auth['userid']}'
    ORDER BY u.username";

    Ausgegeben werden jeweils die Buddys des entsprechenden Benutzers. Wird ein Buddy zur Liste hinzugefügt, ist dieser immer nur bei dem Benutzer drauf, der hinzufügt, beim gegenüber jedoch nicht. Ich würd das ganze nun gern in soweit erweitern,
    dass beim hinzügen eines neuen Buddys eine Art erlaubnisanfrage gestellt wird. Der ausgesuchte Buddy bekommt dann in seiner Liste angezeigt, dass ein Benutzer um Freundschaft fragt. Er kann dann ablehnen oder anehmen. Beim Antragsteller soll als status in der Liste entweder "Bisher noch keine Antwort" bzw bei Annahme "befreundet" oder bei nicht annahme des Antrages "Freundschaft abgelehnt stehn". Soviel zu meinem Vorhaben.

    Mein Problem liegt darin, dass ich einfach nit auf den Trichter komme, inwiefern ich die MySql Tabelle dafür ausbauen bzw. umgestalten muss, um das so wie oben beschrieben zu realisieren.
    Steh ein bischen auf dem Schlauch. Hab schon noch Buddylist scripten gesucht um mir dort etwas anschauungshilfe zu nehmen, bis her aber im netz nicht wirklich was dazu gefunden.

    Wäre euch für Vorschläge & Ideen, wie ich die Table am sinnvollsten gestalten söllte, sehr dankbar
    Geht net gibts net...

  • #2
    1. Falsches Forum.
    2. gar keine Idee? versuchst mal stück für stück.

    du redest vom Status? dann musst du den auch irgendwo speichern. Mehr willst du eigentlich gar nicht. (zumindest steht davon hier nichts.)

    Kommentar


    • #3
      1. Sorry, konnt mich nit zwischen SQl- und Brainstorming entscheiden

      2. Ja, dass ich wohl ne table für den status brauch, soweit bin ich auch.

      Das Problem muss von 2 Seiten betrachtet werden, von der Seite des Benutzers, der um Freundschaft fragt, und der Seite jenes Benutzers, der die Freundschaft annimmt oder ablehnt.

      Beispiel: deschmiddi fragt TobiaZ um Freundschaft oder deschmiddi wird von Hans um Freundschaft gebeten:
      dann hab ich in der MySQL Tabelle folgendes:

      id | userid von deschmiddi | buddyid von TobiaZ | status
      id | userid von Hans | buddyid von deschmiddi| status

      über folgende SQL-Abfrage erscheint nun in der Buddyliste vom deschmiddi, dass er von TobiaZ noch keine keine Antwort hat und dass er von Hans um ftreundschaft gefragt wird:

      SELECT * FROM buddys AS b
      LEFT JOIN user AS u ON u.userid = b.buddyid
      b.userid = '{$auth['userid']}' OR b.buddyid = '{$auth['userid']}'
      ORDER BY u.username

      diese Abfrage holt mir alles aus der Tabelle, wo entweder deschmiddi jemand um freundschaft fragt, oder von anderen um frendschaft gefragt wird, und holt über den LEFTJOIN den Benutzernamen des jeweiligen aus der Table user.

      Hier fangen dann aber die Probleme an.
      Da ich in meiner buddyliste nicht nur angezeigt haben will, wer mein freund ist oder wen ich um freundschaft gefragt habe, sondern auch diejenigen die mich um freundschaft fragen bzw. deren freundschaft ich angenommen habe, stimmen nach obiger abfrage teils die userid und der username nicht. Userid und buddyid sind bei einigen abfragen vertauscht.
      2 seperate sql-abfragen kommen nicht in frage, ich bräucht alles in einer sql-abfrage.
      Hab das ganze dann versucht, über ne 5 table requerstFromUserid zu lösen...

      id | userid deschmiddi | buddyid TobiaZ | status | requestFromUserid deschmiddi

      id | userid hans | buddyid deschmiddi | status | requestFromUserid hans

      bekomme jetzt auch die usernamen und userids richtig angezeigt, jetzt grieg ichs aber nicht nach usernamen sortiert, weil ich userid und buddyid erst nachträglich durch eine zusätzliche funktion tausche.

      Das einzige was mir bis jetzt eingefallen ist, wäre statt userid und buddyid direkt die Benutzernamen in die table zu schreiben. Hat aber den Nachteil, dass wenn jemand seinen Namen ändert, dieser dann auch in den einträgen der Buddyliste geändert werden muss.

      Hat jemand eine Idee, wie man das ganze in eine Abfrage reinbekommt? Oder stimmt vielleicht meine Tabellenstruktur nicht?

      Hoffe dass ich halbwegs klarmachen konnt wo mein Problem liegt
      Geht net gibts net...

      Kommentar


      • #4
        2 seperate sql-abfragen kommen nicht in frage, ich bräucht alles in einer sql-abfrage.
        Warum nicht?


        Wenn du alles in einem Ergebnisset haben willst, nutze halt eine UNION ...
        I don't believe in rebirth. Actually, I never did in my whole lives.

        Kommentar


        • #5
          Benutze zum suchen eine klasse.
          2 Abfragen gleichzeitig wird da aufgrund vom aufbau der klasse etwas problematisch.
          Außerdem müsst ich dann die ergebnisse aus suche 1 und 2 irgentwie in ein aray zusammenschemißen und nach dem benutzernamen sortieren, was nicht so tragisch wäre.

          Okay was Union betrifft sagt mir das nix.
          Werd mal nachstöbern wozu das gut ist
          Danke für den Tipp. Wenn ich nix find, meld ich mich wieder.
          Geht net gibts net...

          Kommentar


          • #6
            Also ich hab das jetzt mal so ausprobiert wie vorgeschlagen, aber ich bekomm aber ne Fehlermeldung.

            Query:
            SELECT b.id, b.UserID, b.buddyid,
            u.username, b.requestFromUserid, b.status
            FROM lansuite_buddys AS b
            LEFT JOIN lansuite_user AS u ON u.userid = b.buddyid
            WHERE b.UserID = '2'

            UNION

            SELECT b.id, b.UserID, b.buddyid,
            u.username, b.requestFromUserid, b.status
            FROM lansuite_buddys as b
            LEFT JOIN lansuite_user as u ON u.userid = b.userid
            WHERE b.buddyid = '2'

            GROUP BY u.username
            ORDER BY u.username ASC
            LIMIT 0, 30

            SQL-Fehler-Meldung:

            Unknown column 'u.username' in 'order clause'
            Query: SELECT b.id, b.UserID, b.buddyid,
            u.username, b.requestFromUserid, b.status
            FROM lansuite_buddys AS b
            LEFT JOIN lansuite_user AS u ON u.userid = b.buddyid
            WHERE b.UserID = '2'
            UNION
            SELECT b.id, b.UserID, b.buddyid,
            u.username, b.requestFromUserid, b.status
            FROM lansuite_buddys as b
            LEFT JOIN lansuite_user as u ON u.userid = b.userid
            WHERE b.buddyid = '2'

            GROUP BY u.username
            ORDER BY u.username ASC
            Geht net gibts net...

            Kommentar


            • #7
              Hab die Lösung gefunden:

              so muss das ganze ausehen:

              (SELECT u.userid, u.username as x, b.id,
              b.UserID, b.buddyid, b.requestFromUserid, b.status
              FROM {$config["tables"]["buddys"]} AS b
              LEFT JOIN {$config["tables"]["user"]} AS u ON u.userid = b.buddyid
              WHERE b.UserID = '{$auth['userid']}')

              UNION

              (SELECT u.userid, u.username as x, b.id,
              b.UserID, b.buddyid, b.requestFromUserid, b.status
              FROM {$config["tables"]["buddys"]} as b
              LEFT JOIN {$config["tables"]["user"]} as u ON u.userid = b.userid
              WHERE b.buddyid = '{$auth['userid']}')

              ORDER BY x
              Geht net gibts net...

              Kommentar

              Lädt...
              X