sortierte abfrage: An welcher stelle steht x?

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

  • sortierte abfrage: An welcher stelle steht x?

    Hi!

    Ich versuche gerade folgende Anwendung zu realisieren:
    Jeder User kan ein oder mehrere Bilder hochladen. Diese können dann von anderen bewertet werden.
    Dazu habe ich eine Datenbank "bewertungen" mit den Feldern "bild_url", "bild_bewertung", "user", und andere.
    Wenn ich jetzt eine Rangliste aller Bilder anzeigen möchte, nach bewertungen sortiert, könnte das ja so aussehen:
    PHP-Code:
    $query "SELECT bild_url, bild_bewertung FROM bewertungen ORDER BY bild_bewertung DESC"
    Die erste ausgabe ist dann platz 1, die zweite platz 2,....
    (falls bewertungen mehrmals vorkommen wird nach Upload - Datum sortiert, hab ich hier jetzt nicht aufgeschrieben)
    Soweit sogut...
    Wenn der User jetzt in seinem Memberbereich eingeloggt ist, kann er sich seine Bilder anzeigen lassen. Das realisiere ich so:
    PHP-Code:
    $query "SELECT bild_url, bild_bewertung FROM bewertungen WHERE user = '$user' ";
    $result mysql_query ($query);
    $anzahl mysql_num_rows ($result); //Anzahl seiner Bilder 
    Und nun das Problem: Wie kriege ich denn jetzt raus, welchen Platz seine Bilder belegen? Ich meine also ob sein entsprechendes Bild nun nach obiger Rangliste Platz 45 oder 34678 oder.... belegt.

    Mfg,
    Stefan

  • #2
    auch aus performancegründen würde ich den platz in eine tabelle extra spalte schreiben, die du dann regelmäßig updatest.

    Kommentar


    • #3
      erstmal Danke für die Antwort!
      nun, das habe ich auch jetzt "eingesehen" :-)
      jetzt habe ich das Problem, die query für das Updaten zu schreiben. Eins ist mir klar: Jedesmal wenn jemand ein neues Bild hochläd, oder eine Bewertung abgibt, muss nun die gesamte Datenbank geupdatet werden. Genauer gesagt müssen alle einträge in der Spalte "platz" neu beurteilt werden.
      Ich habe bisher nur die Idee mir alle Werte auszugeben, die unterhalb des neuen Platzes sind, diese dann mit php in einer schleife bearbeiten (+1)und schließlich alle wieder einzutragen. Wenn also ein Bild von Platz 5 nach 4 wandert, hat der vorheirige Platz 4 nun platz 5, vorheriger platz 5 dann 6, .....
      Dabei sehe ich das Problem, dass SQL zwischen diesen beiden Querys durchaus andere abfragen bearbeiten könnte, deren ergebnisse dann ja logischerweise Falsch wären. Das wäre fatal, das geht auf keinen Fall!.
      Kann man das nicht irgendwie in einen query packen?

      Mfg,
      Stefan

      Kommentar


      • #4
        Hat keiner eine Idee?
        Ich bin bei meiner suche auf folgendes gestossen:
        LOCK TABLES/UNLOCK
        http://dev.mysql.com/doc/refman/4.0/de/lock-tables.html
        Ist das zu empfehlen?
        Wenn ich jetzt vor der ersten Select anweisung die tabelle locke, und erst nach dem letzten Update wieder freigebe, was passiert dann mit den anfragen, die zwischendurch möglicherweise kommen? Werden die Irgendwie gepuffert, und nach dem Unlock ausgeführt, oder werden die einfach abgewiesen und führen dann zu einer Fehlermeldung? Letzteres wäre ja auch irgendwie doof, denn sobald dann einer eine Bewertung abgibt, bekommen z.B. 20 andere User eine Fehlermeldung geliefert....
        Gibt es da denn keinen "Königsweg", der sich bei solchen Problemen als besten erwiesen hat? Wie machen das die Profis?

        Mfg,
        Stefan
        Interessant finde ich folgende Zitate aus dem Referenzhandbuch:
        Wenn Sie inkrementelle Updates (UPDATE kunde SET wert=wert+neuer_wert) oder die LAST_INSERT_ID()-Funktion benutzen, können Sie LOCK TABLES in vielen Fällen vermeiden.
        Nur wie?? Das empfinde ich irgendwie als Hinweis, das mein Vorhaben irgendwie noch viel einfacher geht....
        HINWEIS: LOCK TABLES ist nicht transaktionssicher und schickt automatisch jegliche aktiven Transaktionen ab (Commit), bevor es versucht, die Tabellen zu sperren.
        Das heisst, wenn für jemand anders gerade ein Select ausgeführt wird, dieser abgebrochen wird??? Und dann kommt was? Eine Fehlermeldung? Verstehe ich irgendwie nicht....

        Kommentar


        • #5
          Kannst du nicht die Summe der Bilder abfragen, deren Bewertung besser ist? Wenn 100 Bilder besser bewertet sind als meines, dann ist meines auf Platz 101.

          Gruß,
          ministry
          ich glaube

          Kommentar


          • #6
            Das ist eine gute Idee.
            Aber dann habe ich doch auch das Problem mehrere querys schreiben zu müssen... Eine SECLECT und dannach zig UPDATE (für jede Spalte einen), oder??
            Ich bin absolut ratlos, habe auch nach wie vor nichts brauchbares gefunden.....
            Hiiilfeeeee!! :-)
            Oder mache ich irgendwas falsch? Ist das Thema hier schon mal besprochen worden? (Wo??) Habe ich die Fragen falsch gestellt? Fehlt irgendeine Information? ...

            Mfg,
            Stefan

            Kommentar


            • #7
              wieso für jede Spalte einen? Was für Spalten?

              Die idee ist gar nicht so falsch. einfach ein Count machen und schon hast du den Platz des Users. Das ist nur eine Query. Du sparst dir sämtliche Locks etc.

              Kommentar


              • #8
                Also, wenn das Performance-mäßig noch hinkommt, dann würde ich es nicht so machen, dass der Platz in einer extra Spalte steht. Ich kenne natürlich nicht den Umfang deiner Datenbank, aber das lässt sich ja ausprobieren.
                ich glaube

                Kommentar


                • #9
                  Jo, da muss ich dir absolut recht geben. Deine Möglichkeit hatte ich nicht in betracht gezogen.

                  Kommentar


                  • #10
                    Ahhh, jetzt verstehe ich ministrys vorschlag....Stimmt so kann ich rausfinden an welcher stelle x steht (ursprungsposting). Jetz habe ich allerdings das Problem, dass ich inzwischen schon weitergearbeitet habe, und alles auf die Spalte "Platz" ausgerichtet habe... (((
                    Aber das mit dem count probiere ich jetzt mal aus, und wenn das problemlos klappt und bei mir anwendbar ist, schreibe ich ebend alles nochmal um.
                    Endlich mal ein Lichtblick! DANKE!
                    @TobiaZ Ich meinte Datensätze, nicht Spalten, sorry!

                    Mfg,
                    Stefan

                    Kommentar


                    • #11
                      Es klappt wunderbar!!! Ich habe auch schon das ganze Script darauf umgeschrieben.
                      Für Leute, die mal auf ein ähnliches Problem stossen, hier die Abfrage:
                      PHP-Code:
                      // In den Variabelen in der query stehen die Daten von dem Bild dessen Platz
                      // ich rausfinden will
                      $query "SELECT COUNT(bild_bewertung) as platz FROM bewertungen WHERE (bild_bewertung > '$bild_bewertung') or
                      (bild_bewertung = '
                      $bild_bewertung' and zeitpunkt_upload < '$zeitpunkt_upload') LIMIT 1";
                      $result mysql_query ($query);
                      $datensatz mysql_fetch_assoc ($result);
                      $datensatz['platz'] ++;
                      $erreichter_platz $datensatz['platz']; 
                      Nochmal Danke für die Hilfe!!!
                      Mfg,
                      Stefan

                      Kommentar

                      Lädt...
                      X