Ankündigung

Einklappen
Keine Ankündigung bisher.

Abfrage von Beiträe von Freunden

Einklappen

Neue Werbung 2019

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

  • Abfrage von Beiträe von Freunden

    Hi zusammen,
    Ich habe derzeit mit einem Problem zu kämpfen.
    Es gibt zwei Tabellen: freunde und beitrage.

    In der freunde-Tabelle siehts folgendermaßen aus:
    Code:
    nutzer, befreundetmit
    Und in der beitrage-Tabelle:
    Code:
    id, nutzerid, text
    Natürlich gibt's noch die Nutzertabelle mit Passwörtern, Nutzernamen etc.

    Folgendes Szenario:
    nutzer 1 ist mit den Nutzern 2,3,6,7 befreundet und soll auf seiner Dashboard-Seite deren Beiträge sehen.
    Die beiden Tabellen sind nun mit Daten befüllt und sehen wie folgt aus:
    Code:
    freunde:
    1,2
    1,3
    1,6
    1,7
    
    beitrage:
    1,3,hallo
    2,3,test
    3,6,hey
    Nun sollte der Nutzer 1 auf seiner Dashboard-Seite
    die Beiträge nach ID sortiert sehen.

    Wie löse ich das am Besten?

    Nächstes Problem:
    Nehmen wir nun an, 1.000 Personen sind untereinander befreundet.
    Dies würde bedeuten, dass ich also rund 500.000 Einträge habe.
    Wie kann ich dies effektiver lösen? Oder gibt es dort keine effektivere Möglichkeit?
    Ich hatte beispielsweise überlegt, die Zeile "befreundetmit" einzufügen.
    Jedoch würde sich hier eine große Anzahl Zeichen ansammeln, was ich nicht unbedingt möchte,
    da dies ja auch wiederum Limits hätte.

    Ich danke jedem für seine Tipps, insbesondere zu meinem Anliegen 1!

  • #2
    Du müsstest eine weitere Tabelle anlegen mit Freundschaften.

    freundschaft_id, nutzerid1, nutzerid2
    In dieser sind die Nutzer mit ihren IDs (Primärschlüssel) verbunden.
    Bei einer neuen Freundschaft trägst du dann die nutzerids der beiden ein.

    bestehende Freundschaften kannst du dann aus der "Freundschaften" Tabelle abfragen.
    Du kannst dann auch die Beiträge der Freunde über diese Tabelle abrufen.

    Ich hoffe ich habe dein Problem richtig verstanden. Aber so wie ich das sehe ist hier deine Datenbank in keiner Normalform.

    Kommentar


    • #3
      Nehmen wir nun an, 1.000 Personen sind untereinander befreundet.
      Dies würde bedeuten, dass ich also rund 500.000 Einträge habe.
      Wie kann ich dies effektiver lösen?
      LIMIT / Pagination

      500.000 Datensätze will niemand auf einmal sehen.. nicht mal 500
      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

      Kommentar


      • #4
        Zitat von xDrago Beitrag anzeigen
        Du müsstest eine weitere Tabelle anlegen mit Freundschaften.



        In dieser sind die Nutzer mit ihren IDs (Primärschlüssel) verbunden.
        Bei einer neuen Freundschaft trägst du dann die nutzerids der beiden ein.

        bestehende Freundschaften kannst du dann aus der "Freundschaften" Tabelle abfragen.
        Du kannst dann auch die Beiträge der Freunde über diese Tabelle abrufen.

        Ich hoffe ich habe dein Problem richtig verstanden. Aber so wie ich das sehe ist hier deine Datenbank in keiner Normalform.
        Danke zunächst für die Antwort,
        die Tabelle ist ja bereits da, auch wie Du sagtest (oder so ähnlich?).
        Ehrlich gesagt verstehe ich nämlich nicht ganz wie du das meinst.

        Jeder meiner Nutzer hat eine ID.
        Befreundet sich nun Nutzer mit der ID 1 mit dem Nutzer mit der ID 6
        wird ein neuer Eintrag in der Tabelle "freunde' erstellt, nämlich
        1 (nutzer), 6 (befreundetmit).
        "nutzer" und "befreundetmit" sind jeweils Spalten (ich glaube das heißt so).
        Kann aber auch sein, dass ich das falsch verstanden habe .

        Aber mein Problem ist, dass die Abfrage keine normale ist,
        Sie lautet nicht "SELECT * FROM betrage"
        sondern ich muss genau die Beträge heraussuchen, deren Ersteller mit der
        Person befreundet ist.

        Besucht zB Nutzer mit der ID 1 das Dashboard und ist mit den Nutzern mit den IDs 4, 6, 7 befreundet,
        müsste man die Beiträge der Nutzer heraussuchen, zum Beispiel "SELECT * FROM beitrage WHERE author = 4 OR author = 6 OR author = 7".
        Soweit ok. Was aber, wenn ein Nutzer mit 100 Leuten befreundet ist?
        Dann müsste ich theoretisch erst einmal mit einer WHILE durch die freunde-tabelle und dann bei jedem Eintrag die Nutzer heraussuchen.
        Das wäre massiver Performanceverlust.

        Zitat von lstegelitz Beitrag anzeigen

        LIMIT / Pagination

        500.000 Datensätze will niemand auf einmal sehen.. nicht mal 500
        LIMIT nutze ich sowieso und rufe nach und nach ab.
        Dennoch braucht das System "zum Suchen" ja bereits Zeit.
        Und bei 500.000 Einträgen würde die Zeit zunehmen.


        Hier wäre mal toll zu wissen, wie Facebook und co. das machen.
        Dort werden ja auch die Beiträge meiner Freunde angezeigt.
        So ähnlich müsste ich das umsetzen.

        Kommentar


        • #5
          sondern ich muss genau die Beträge heraussuchen, deren Ersteller mit der
          Person befreundet ist.

          Besucht zB Nutzer mit der ID 1 das Dashboard und ist mit den Nutzern mit den IDs 4, 6, 7 befreundet,
          Ja, und?

          Das ist ein relative simples SQL mit einem JOIN.
          Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

          Kommentar


          • #6
            Zitat von lstegelitz Beitrag anzeigen
            Ja, und?

            Das ist ein relative simples SQL mit einem JOIN.
            Danke für deine Antwort.
            Könntest Du eine Abfrage anhand meiner Tabellen mit einem JOIN erstellen?

            Kommentar


            • #7
              Ohne Kenntnis der Feldnamen nur schematisch

              Code:
              SELECT
              f.fid,
              b.text
              FROM freunde f
              LEFT JOIN beitraege b ON f.fid = b.uid
              WHERE f.uid = 1
              ORDER BY b.id
              fid = Freundes- ID
              uid = User-ID
              text = Beitragstext
              sortiert nach Beitrags-ID
              Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

              Kommentar


              • #8
                Zitat von lstegelitz Beitrag anzeigen
                Ohne Kenntnis der Feldnamen nur schematisch

                Code:
                SELECT
                f.fid,
                b.text
                FROM freunde f
                LEFT JOIN beitraege b ON f.fid = b.uid
                WHERE f.uid = 1
                ORDER BY b.id
                fid = Freundes- ID
                uid = User-ID
                text = Beitragstext
                sortiert nach Beitrags-ID
                Danke Dir schonmal für den sehr hilfreichen Tipp!
                Ich glaube, dieser brachte mich auf jeden Fall schonmal sehr weiter!


                Code:
                SELECT
                f.befreundetmit,
                b.text
                FROM freunde f
                LEFT JOIN beitrage b ON f.befreundetmit = b.nutzerid
                WHERE f.nutzerid = 1
                ORDER BY b.id
                Diese Abfrage sucht nun zunächst in der Tabelle freunde nach Einträgen wo nutzerid die ID des Nutzers ist
                um dann Beiträge herauszusuchen, welche von dem Nutzer mit der ID befreundetmit erstellt wurden.
                Ist meine Abfrage dann so richtig?
                Oder muss statt "b.nutzerid" dann "b.befreundetmit" hin, weil ja die Einträge herausgesucht werden sollen,
                die die ID befreundetmit geschrieben hat?
                Dann habe ich noch ein weiteres Problem.
                Vorname, Nachname etc. des Beitragserstellers stehen weder in beitrage noch
                in freunde sondern in nutzer. Wie bekomme ich nun beispielsweise den vornamen von
                der ID des Freundes mit in die Abfrage bzw. den Join?
                Danke Dir!

                Kommentar


                • #9
                  Hör mal bitte auf Zeilenumbrüche mitten in deine Sätze zu hauen, das liest sich voll komisch.
                  Oder muss statt "b.nutzerid" dann "b.befreundetmit" hin, weil ja die Einträge herausgesucht werden sollen, die die ID befreundetmit geschrieben hat?
                  Sieht recht richtig aus wie es ist. Aber schick die Abfrage doch einfach mal an die Datenbank und sieh nach ob das Ergebnis deiner Erwartung entspricht.

                  Dann habe ich noch ein weiteres Problem.
                  Vorname, Nachname etc. des Beitragserstellers stehen weder in beitrage noch in freunde sondern in nutzer. Wie bekomme ich nun beispielsweise den vornamen von der ID des Freundes mit in die Abfrage bzw. den Join?
                  Du musst noch einen Join anbauen.
                  Geh mir dem Feld befreundetmit an die Usertabelle um dir die dazugehörigen Userdaten zu holen.
                  [COLOR=#A9A9A9]Relax, you're doing fine.[/COLOR]
                  [URL="http://php.net/"]RTFM[/URL] | [URL="http://php-de.github.io/"]php.de Wissenssammlung[/URL] | [URL="http://use-the-index-luke.com/de"]Datenbankindizes[/URL] | [URL="https://www.php.de/forum/webentwicklung/datenbanken/111631-bild-aus-datenbank-auslesen?p=1209079#post1209079"]Dateien in der DB?[/URL]

                  Kommentar


                  • #10
                    Wuhu! Ich bin euch beiden sehr dankbar! Habs nun getestet und das Ergebnis bekommen, was ich wollte. Danke vielmals!

                    Kommentar


                    • #11
                      Eine Sache noch: der LEFT JOIN führt dazu, das wenn ein Freund noch keinen Beitrag erstellt hat, keine Daten in der beitraege-Tabelle erscheinen (Felder sind NULL). Zur Vermeidung INNER JOIN verwenden (dadurch wird aber auch der Freund aus der Egebnisliste entfernt)
                      Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

                      Kommentar

                      Lädt...
                      X