Ankündigung

Einklappen
Keine Ankündigung bisher.

Probleme beim zusammenfügen von MySql Einträgen...

Einklappen

Neue Werbung 2019

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

  • Probleme beim zusammenfügen von MySql Einträgen...

    Hallo MySql Profis ^^

    Ich habe echt ein blödes Problem, denn ich komme irgendwie beim logischen Denken nicht so ganz voran..
    Was ich machen möchte ist folgendes:
    Es geht um die Bewertung verschiedener Bilder, dessen Kommentare (also die Bewertung) in der DB gespeichert werden.
    In einer DB upload_comment sind verschiedene Einträge vorhanden.
    Diese bestehen aus mehreren Teilen, davon sind aber momentan nur zwei wichtig: pic und rate!
    pic gibt den Namen eines Bildes an, das hochgeladen wurde und rate eine Zahl zwischen 1 und 10.
    Da alle Kommentare aller Bilder dort abgespeichert werden gibt es einige Einträge mit gleichem und einige mit anderem "pic" namen.
    Rate hingegen ist logischerweise immer verschieden.

    Das kann zum Beispiel so aussen:

    Code:
    pic -- rate
    Haruhi_9 (2).jpg -- 4
    Haruhi_9 (2).jpg -- 5
    Haruhi_9 (2).jpg -- 1
    Haruhi_9 (2).jpg -- 6
    Hack.jpg -- 7
    Hack.jpg -- 2
    Jetzt will ich, dass alle Einträge mit gleichen Inhalt in pic zusammengenommen werden und die Rates zusammengezählt und durch die anzahl der Eintrage geteilt werden, die von diesem pic Namen existieren.
    Es soll also der Durchschnitt berechnet werden.

    Nun das mit dem Berechnen und so könnt ich auch selbst aber das zusammenfügen dieser Eintrage krieg ich irgendwie nicht hin.
    Das einzige was ich geschafft habe ist es so wie im obigen Code auszugeben.

    Kann mir jemand einen Tipp geben, wie ich das angehen könnte...
    Irgendwie ist mein Kopf wahnsinnig leer momentan und ich schaffs nicht >_<

    Dankschön für eure Hilfe,
    Gruss Toby
    codestyle.ch
    ----------------------------


  • #2
    Ich hab zwar noch nicht ganz verstanden wie GENAU deine Tabellen jetzt aufgebaut sind - aber das klignt nach einem saumäßig schlechten DB-Design

    Du kannst mit GROUP BY nach einer Spalte gruppieren (also gleiche Einträge zusammenfassen) und mit den Aggregatsfunktionen von MySQL ( MySQL :: MySQL 5.0 Reference Manual :: 11.11.1 GROUP BY (Aggregate) Functions ) arbeiten.

    Das könnte dann in etwa so aussehen:
    SELECT name, AVG(rate) FROM upload_comment GROUP BY name
    Create your own quiz show.

    Kommentar


    • #3
      Ja, da hast du schon recht. So ganz gut aufgebaut habe ich die Datenbank nicht.. Hatte dort schon einige Probleme.
      Ich erklär mal genau wie die DB momentan aufgebaut ist.

      Diese zwei Tabellen sind wichtig.
      Die Eine (rechts) zeigt die normalen Upload Informationen. Dazu gehört der Name des bilder "name" und die Beschreibung "description".

      In der Anderen (links) sind die Kommentare aller Bilder gespeichert.
      Dies habe ich so gelöst, wie ich oben bereits erklärt habe.
      Anders habe ich es nicht geschaft verschiedene Kommentare für verschiedene Bilder in einer Tabelle zu speichern.
      Falls du da schon eine andere möglichkeit weisst, wäre ich froh, denn dann baue ich lieber das Script nochmals einwenig um, anstatt es noch zu verschlechtern...

      Das ist eigentlich alles was du wissen solltest, denn weiter bin ich auch nicht gerade..
      Das mit dem Group by habe ich noch nicht ausprobiert, da dies zu kompliziert werden würde mit der momentanen DB Struktur.

      Hast du ein Tipp für mich, was ich da machen könnte?

      Danke
      Gruss Toby
      codestyle.ch
      ----------------------------

      Kommentar


      • #4
        Hallo Toby,

        das GROUP BY funktioniert auch bei deiner bisherigen Datenstruktur.

        Du solltest dir mal ein paar Tutorials zum Aufbau von Relationalen Datenbanken anschauen, Stichwort: Normalisierung.

        In deinem Fall gibt Es Bilder und Kommentare. Wobei ein Kommentar immer zu genau einem Bild gehört und ein Bild mehrere Kommentare haben kann. Daraus ergibt sich dann in etwa folgende Struktur:

        images
        id | description | name
        comments
        id | image_id | message | name | email | rating

        Statt also die Tabellen über den Bildernamen zu verknüpfen, werden sie über image_id verknüpft. (Jenachdem ob jeder kommentieren kann oder nur angemeldete Benutezr solltest du auch noch Name und Email in eine extra Tabelle schieben...)

        Wenn du jetzt für alle Bilder die durschnittliche Bewertung ermitteln möchtest geht das über:
        SELECT images.name, AVG(comments.rating) FROM images JOIN comments ON images.id = comments.image_id GROUP BY images.name

        Das sieht jetzt verdammt kompliziert aus - aber wenn du dich mal eine Weile mit sowas beschäftigst ist das alles ganz einfach
        Create your own quiz show.

        Kommentar


        • #5
          Thx, das is genau das was ich gesucht habe ^_^

          Ehrlich gesagt hab ich das sogar schonmal irgendwo so ähnlich gelesen aber nie genauer angeschaut.

          Werde mir das mal anschauen und mein Script anpassen.

          Vielen Dank
          Gruss Toby

          EDIT: Achja wer mal ein ähnliches Problem hat.. Ich hab gerade das hier gefunden: #php/QuakeNet Tutorial - MySQL / Tabellen Verknüpfen
          codestyle.ch
          ----------------------------

          Kommentar


          • #6
            Aggregate Funktionen kombinieren?

            Abend
            Ich bins mal wieder...
            Sry wegen dem Doppelpost erstmal, da mein Problem aber wieder mit dem obigen MySql Dingen funktioniert, dachte ich, ich stells wieder hier rein..

            Jetziges Problem:
            Ich habe, wie schon vorher, verschiedene Kommentare abgespeichert.
            Nun möchte ich den Durchschnitt Dieser ausrechnen.
            Naja, das habe ich auch hingekriegt siehe:

            Code:
                // Get AVG from all rates (Durchschnitt)
                $sql = "SELECT upload_id, AVG(rate) FROM upload_comment WHERE upload_id = '$id' GROUP BY upload_id";
                $result = mysql_query($sql);
                $rate_avg = mysql_fetch_array($result); // Durchschnitt
                //echo $rate_avg["AVG(rate)"];
            Naja, das war auch noch keine so grosse Sache.. jedoch zu meinem Problem:
            Nun möchte ich von allen Durchschnitten (nicht ans Essen denken xD) den grössten haben und auch die anderen Daten dieses Rows.
            Mit meiner Methode schaffe ich es aber nur entweder den Durchschnitt (AVG) oder den grössten Eintrag (MAX) zu bekommen.

            Kann ich diese irgendwie kombinieren, so dass ich zuerst den Durchschnitt und von diesem dann den grössten rauskriege?

            Wenn nicht, was kann ich sonst tun?

            Danke für eure Hilfe...
            Gruss Toby
            codestyle.ch
            ----------------------------

            Kommentar

            Lädt...
            X