Re: Bestenliste ausgeben - baseportal Forum - Web-Anwendungen einfach, schnell, leistungsfähig!
baseportal
English - Deutsch "Es gibt keine dummen Fragen - jeder hat einmal angefangen"

 baseportal-ForumDie aktuellsten 10, 30, 50, 100 Einträge anzeigen.  

 
 Ausgewählter Eintrag: Zur Liste 
    Beitrag von Christoph Bergmann (8110 Beiträge) am Donnerstag, 5.Oktober.2006, 00:46.
    Re: Bestenliste ausgeben

      Nachtrag: Ahso, verstanden, mit Deiner Lösung muss man nich jeden Eintrag von "richtig" durchlaufen... Kommt aber auf die Anzahl / Name an was schneller is... Insofern nimmt sichs wahrscheinlich nix... ;-)


    Antworten

 Alle Einträge zum Thema: Zur Liste 
    Beitrag von mk (966 Beiträge) am Mittwoch, 4.Oktober.2006, 19:54.
    Bestenliste ausgeben

      Hallo,
      ich möchte eine Bestenliste ausgeben.
      Es gibt eine DB der Teilnehmer (name)
      und eine DB für die richtigen Antworten (richtig)
      ich könnte natürlich nach jeder richtigen Antwort beim Nutzer den Stand abspeichern.
      Hier die unsortierte Ausgabe:
      <perl>
      get "name~=m sort=name", "name";#zum Test
       while(get_next name)
      {
      $_amount="";
      get "name==$name", "richtig";
      if ($_amount >0)
      {
      out "<b>$name</b> ($_amount) <br>";
      }
      $name="";
      }
      </perl>
      
      da kommt das raus:
      mandy (2)
      Maria (19)
      marianne (26)
      Marina (66)
      Marvin (11)
      Michael (5)

      Kann dies auch sortiert nach den Zahlen ausgegeben werden?

      Michael

     Antworten

    Beitrag von Sander (8133 Beiträge) am Mittwoch, 4.Oktober.2006, 21:30.
    Re: Bestenliste ausgeben

      im hash speichern
      <perl>
      get "name~=m sort=name", "name";#zum Test
       while(get_next "name")
      {
        #$_amount="";
        get "name==$name", "richtig";
        if ($_amount >0)
        {
           $best{$name}=$_amount;
           #out "<b>$name</b> ($_amount) <br>";
        }
        #$name="";
      }
      

      foreach $k(sort{$best{$a}<=>$best{$b}} keys %best){
         print "$k => $best{$k}<br>";
      }
      </perl>
      

     Antworten

    Beitrag von mk (966 Beiträge) am Mittwoch, 4.Oktober.2006, 22:13.
    Re: Bestenliste ausgeben

     Antworten

    Beitrag von Sander (8133 Beiträge) am Mittwoch, 4.Oktober.2006, 23:35.
    Re: Bestenliste ausgeben

      naja, in bp is halt out statt print.
      hast schon mal selbst versucht, den fehler zu finden? sind doch nur ein paar zeilen.

     Antworten

    Beitrag von Christoph Bergmann (8110 Beiträge) am Mittwoch, 4.Oktober.2006, 22:14.
    Re: Bestenliste ausgeben

      Wenn ich das Problem richtig verstanden habe, sollte:

       get "name==$name", "richtig";
       while(get_next "richtig")
       {
         $best{$name}=$_amount;
       }
      
       foreach $k(sort{$best{$a}<=>$best{$b}} keys %best)  {    out "$k => $best{$k}<br>";  }

      reichen...

      Noch eine Anmerkung zum ersten Code:

       get "name~=m sort=name", "name";
      

      Hier ist das "sort" unnötig, weil die Abfrage automatisch nach "name" sortiert. "sort" kostet viel Zeit, also

       get "name~=m", "name";
      

      Aber eigentlich brauchts die Abfrage hier eh nicht...

     Antworten

    Beitrag von Sander (8133 Beiträge) am Mittwoch, 4.Oktober.2006, 23:33.
    Re: Bestenliste ausgeben

      also ich denke schon, das das obere get dabei sein sollte, da die abfrage auf richtig eher mit sql group by zu beschreiben wäre und kein while dabei sein muß. er will ja nur die einträge pro name haben.

     Antworten

    Beitrag von Christoph Bergmann (8110 Beiträge) am Donnerstag, 5.Oktober.2006, 00:39.
    Re: Bestenliste ausgeben

      Wenn ich es richtig verstanden habe gibt es keine Einträge in "richtig" dessen Name nicht auch in Teilnehmer steht - dann reicht "richtig" zu durchlaufen... Was war nochmal "sql"? ;-)

     Antworten

    Beitrag von Christoph Bergmann (8110 Beiträge) am Donnerstag, 5.Oktober.2006, 00:46.
    Re: Bestenliste ausgeben

      Nachtrag: Ahso, verstanden, mit Deiner Lösung muss man nich jeden Eintrag von "richtig" durchlaufen... Kommt aber auf die Anzahl / Name an was schneller is... Insofern nimmt sichs wahrscheinlich nix... ;-)

     Antworten

    Beitrag von mk (966 Beiträge) am Donnerstag, 5.Oktober.2006, 08:12.
    Re: Bestenliste ausgeben

     Antworten

    Beitrag von Sander (8133 Beiträge) am Donnerstag, 5.Oktober.2006, 11:11.
    Re: Bestenliste ausgeben

      welchen Code hast du jetzt verwendet? meinen oder Cbs?

     Antworten

    Beitrag von mk (966 Beiträge) am Donnerstag, 5.Oktober.2006, 12:58.
    Re: Bestenliste ausgeben

      von cb

     Antworten

    Beitrag von mk (966 Beiträge) am Donnerstag, 5.Oktober.2006, 20:12.
    Re: Bestenliste ausgeben

      Hallo Sander hab nun doch deine Lösung genommen, da ich noch ein Filter setzen wollte der nur in der DB nutzer steht.
      Hab aber im Moment ein Blackout,
      das "Problem" hatte ich schonmal hier gelöst bekommen, finde es aber leider nicht mehr.
      Brich eine Schelfe ab wenn eine Bedingung erfüllt.
      ich Möchte nur die 5 Besten ausgeben.
      So sieht mein Quelltexzt derzeit aus:
      <perl>
      out <<EOF;
      <table border="0" width="120">
        <tr>
          <td colspan="2">
      <b><font size="3">Bestenliste</font></b>
          </td>
        </tr>
        <tr>
          <td colspan="2"><font size="1">der richtigen Antworten</font></td>
        </tr>
        <tr>
          <td colspan="2">
      <b><font size="2">5. Klasse</font></b>
          </td>
        </tr>
      EOF
      $i="";
      get "name>=a aKlasse==5", "name";
       while(get_next "name")
      {
        get "name==$name", "richtig";
        if ($_amount >0)
        {
           $best{$name}=$_amount;
        }
      }
      foreach $k (sort {$best{$b}<=>$best{$a}} keys %best){
      out "<tr><td align='right'>$best{$k}</td><td>$k ($i)</td></tr>";
      $i=$i+1 ;
      #hier müßte stehen brich ab bei i=4
      }
      out "</table>";
      #hier kommt dann die 6. und 7. Klasse genauso
      </perl>
      

      Michael

     Antworten

    Beitrag von Claus (4645 Beiträge) am Donnerstag, 5.Oktober.2006, 20:24. WWW: jobmarder.de
    Re: Bestenliste ausgeben

      Bin zwar nicht Sander, aber änder das mal so:

      <perl>
      out <<EOF;
      <table border="0" width="120">
        <tr>
          <td colspan="2">
      <b><font size="3">Bestenliste</font></b>
          </td>
        </tr>
        <tr>
          <td colspan="2"><font size="1">der richtigen Antworten</font></td>
        </tr>
        <tr>
          <td colspan="2">
      <b><font size="2">5. Klasse</font></b>
          </td>
        </tr>
      EOF
      $i="";
      get "name>=a aKlasse==5", "name";
      

      while (get_next("name") && $i<4)

       while(get_next "name")
      {
        get "name==$name", "richtig";
        if ($_amount >0)
        {
           $best{$name}=$_amount;
        }
      }
      foreach $k (sort {$best{$b}<=>$best{$a}} keys %best){
      out "<tr><td align='right'>$best{$k}</td><td>$k ($i)</td></tr>";
      $i=$i+1 ;
      }
      out "</table>";
      #hier kommt dann die 6. und 7. Klasse genauso
      </perl>
      


      eventuell hier
      while (get_next("name") && $i<4)
      

       bei $i<4 den Wert ändern

      Gruß

      Claus

     Antworten

    Beitrag von Claus (4645 Beiträge) am Donnerstag, 5.Oktober.2006, 20:28. WWW: jobmarder.de
    Re: Bestenliste ausgeben

      sorry, muß mir wohl mal wieder ein neues Hackbrett zulegen;-)

      <perl>
      out <<EOF;
      <table border="0" width="120">
        <tr>
          <td colspan="2">
      <b><font size="3">Bestenliste</font></b>
          </td>
        </tr>
        <tr>
          <td colspan="2"><font size="1">der richtigen Antworten</font></td>
        </tr>
        <tr>
          <td colspan="2">
      <b><font size="2">5. Klasse</font></b>
          </td>
        </tr>
      EOF
      $i="";
      get "name>=a aKlasse==5", "name";
      while (get_next("name") && $i<4)
      {
        get "name==$name", "richtig";
        if ($_amount >0)
        {
           $best{$name}=$_amount;
        }
      }
      foreach $k (sort {$best{$b}<=>$best{$a}} keys %best){
      out "<tr><td align='right'>$best{$k}</td><td>$k ($i)</td></tr>";
      $i=$i+1 ;
      #hier müßte stehen brich ab bei i=4
      }
      out "</table>";
      #hier kommt dann die 6. und 7. Klasse genauso
      </perl>
      

      eventuell hier
      while (get_next("name") && $i<4)
      

       bei $i<4 den Wert ändern

      Gruß

      Claus

     Antworten

    Beitrag von Sander (8133 Beiträge) am Donnerstag, 5.Oktober.2006, 20:41.
    Re: Bestenliste ausgeben

      foreach $k (sort {$best{$b}<=>$best{$a}} keys %best){
        out "<tr><td align='right'>$best{$k}</td><td>$k ($i)</td></tr>";
        last if ++$i==5;
      }
      

     Antworten

    Beitrag von mk (966 Beiträge) am Donnerstag, 5.Oktober.2006, 20:58.
    Re: Bestenliste ausgeben

      Danke

     Antworten

    Beitrag von Claus (4645 Beiträge) am Donnerstag, 5.Oktober.2006, 20:49. WWW: jobmarder.de
    Re: Bestenliste ausgebenNachtrag;-)

      alternativ kannst Du die Schleife auch bei foreach abrechen, dann so:

      <perl>
      out <<EOF;
      <table border="0" width="120">
        <tr>
          <td colspan="2">
      <b><font size="3">Bestenliste</font></b>
          </td>
        </tr>
        <tr>
          <td colspan="2"><font size="1">der richtigen Antworten</font></td>
        </tr>
        <tr>
          <td colspan="2">
      <b><font size="2">5. Klasse</font></b>
          </td>
        </tr>
      EOF
      $i="";
      get "name>=a aKlasse==5", "name";
       while(get_next "name")
      {
        get "name==$name", "richtig";
        if ($_amount >0)
        {
           $best{$name}=$_amount;
        }
      }
      foreach $k (sort {$best{$b}<=>$best{$a}} keys %best){
      out "<tr><td align='right'>$best{$k}</td><td>$k ($i)</td></tr>";
      $i=$i+1 ;
      last if $i>4;###hier wird abgebrochen, Wert mußt Du eventuell anpassen!!! 
      #hier müßte stehen brich ab bei i=4
      }
      out "</table>";
      #hier kommt dann die 6. und 7. Klasse genauso
      </perl>
      

      ohne Gewähr;-)

      Gruß

      Claus

     Antworten

    Beitrag von Sander (8133 Beiträge) am Donnerstag, 5.Oktober.2006, 21:10.
    Re: Bestenliste ausgebenNachtrag;-)

      nich alternativ sondern nur genau da.
      Das andere führt nicht zum gewünschten

     Antworten

    Beitrag von Claus (4645 Beiträge) am Donnerstag, 5.Oktober.2006, 21:24. WWW: jobmarder.de
    Re: Bestenliste ausgebenNachtrag;-)

      ja, hast ja recht.;-)

      sollte eigentlich auch"richtiger ist...) heißen, bin aber momentan etwas ausgepowert, da ich mich hier ständig rechtfertigen muß und daher Sonderschichten bei meinen eigenen Dingen einlegen muß.

      Gruß

      Claus

     Antworten

    Beitrag von mk (966 Beiträge) am Donnerstag, 5.Oktober.2006, 21:57.
    Re: Bestenliste ausgebenNachtrag;-)

      Hallo.
      auf wem soll ich den nun antwoten, das von sander geht schon,
      aber wenn ich den code untereinander copiere muß ich noch was zurücksetzen,
      hab schon einiges ohne Erfolg probiert,
      aber es wird weiterhin von der vorigen Klasse angezeigt:
      http://kochhome.de/cgi-bin/baseportal.pl?htx=/kochhome.de/vokabeltrainer/index
      auch wenn ich mich wiederhole, soe sieht der code jetzt für die 3 Klassen aus.
      <perl>
      out <<EOF;
      <table border="0" width="120">
        <tr>
          <td colspan="2">
      <b><font size="3">Bestenliste</font></b>
          </td>
        </tr>
        <tr>
          <td colspan="2"><font size="1">der richtigen Antworten</font></td>
        </tr>
        <tr>
          <td colspan="2">
      <b><font size="2">5. Klasse</font></b>
          </td>
        </tr>
      EOF
      $i="";
      get "name>=a aKlasse==5", "name";#zum Test
       while(get_next "name")
      {
        get "name==$name", "richtig";
        if ($_amount >0)
        {
           $best{$name}=$_amount;
        }
      }
      foreach $k (sort {$best{$b}<=>$best{$a}} keys %best){
      out "<tr><td align='right'><font size='2'>$best{$k}</font></td><td><font size='2'>$k</font></td></tr>";
        last if ++$i==5;
      }
      ############################################################################
      out "<tr><td colspan='2'><b><font size='2'>6. Klasse</font></b></td></tr>";
      $i="";
      get "name>=a aKlasse==6", "name";#zum Test
       while(get_next "name")
      {
        get "name==$name", "richtig";
        if ($_amount >0)
        {
           $best{$name}=$_amount;
        }
      }
      foreach $k (sort {$best{$b}<=>$best{$a}} keys %best){
      out "<tr><td align='right'><font size='2'>$best{$k}</font></td><td><font size='2'>$k</font></td></tr>";
        last if ++$i==5;
      }
      #############################################################################
      out "<tr><td colspan='2'><b><font size='2'>7. Klasse</font></b></td></tr>";
      $i="";
      get "name>=a aKlasse==7", "name";#zum Test
       while(get_next "name")
      {
        get "name==$name", "richtig";
        if ($_amount >0)
        {
           $best{$name}=$_amount;
        }
      }
      foreach $k (sort {$best{$b}<=>$best{$a}} keys %best){
      out "<tr><td align='right'><font size='2'>$best{$k}</font></td><td><font size='2'>$k</font></td></tr>";
        last if ++$i==5;
      }
      out "</table>";
      </perl>
      
      Michael

     Antworten

    Beitrag von Sander (8133 Beiträge) am Donnerstag, 5.Oktober.2006, 23:01.
    Re: Bestenliste ausgebenNachtrag;-)

      statt
      $i="";
      get "name>=a aKlasse==
      

      %best=();
      $i=0;
      get "...
      

      für jede klasse

     Antworten

    Beitrag von mk (966 Beiträge) am Freitag, 6.Oktober.2006, 09:10.
    Re: Bestenliste ausgebenNachtrag;-)

      Danke,
      alles bestens.

     Antworten

    Beitrag von Claus (4645 Beiträge) am Donnerstag, 5.Oktober.2006, 15:24. WWW: jobmarder.de
    Re: Bestenliste ausgeben

      Hallo Michael,

      wie Christoph schon geschrieben hat, scheinen sowohl Name als auch richtige Antworten in einer Datenbank zu sein.

      Warum dann nicht ganz simpel:

      get "Id=* sort=richtigeantwortenfeld", "richtig";
      

      while(get_next("richtig"))
      {
      out "<b>$name</b> ($richtigeantwortenfeld) <br>";
      }
      </perl>
      

      Ich hoffe mal, ich habe Dich jetzt nicht falsch verstanden?

      Gruß

      Claus

     Antworten

    Beitrag von Sander (8133 Beiträge) am Donnerstag, 5.Oktober.2006, 15:31.
    Re: Bestenliste ausgeben

      weil für jede richtige antwort ein eintrag in dieser db ist.
      zb beispiel sander hat 13 falsche antworten (war ja zu erwarten): steht kein einziger eintrag mit namen sander drin.
      claus hat 12 richtige - claus hat 12 einträge drin stehen.
      also wenn nach CB:

       get "name~=m", "richtig";
       while(get_next "richtig")
       {
         $best{$name}++;
       }
      
       foreach $k(sort{$best{$a}<=>$best{$b}} keys %best)  {    out "$k => $best{$k}<br>";  }

     Antworten

    Beitrag von mk (966 Beiträge) am Donnerstag, 5.Oktober.2006, 15:49.
    Re: Bestenliste ausgeben fasst geschaft

      Danke Sander,
      nur wie drehe ich die Sortierreihenfolge um.
      Jetzt steht der Schlechsteste an erster Stelle.

      Michael

     Antworten

    Beitrag von Sander (8133 Beiträge) am Donnerstag, 5.Oktober.2006, 16:18.
    Re: Bestenliste ausgeben fasst geschaft

      foreach $k(reverse sort{$best{$a}<=>$best{$b}} keys %best)
       {
         out "$k => $best{$k}<br>";
       }
      

     Antworten

    Beitrag von Christoph Bergmann (8110 Beiträge) am Donnerstag, 5.Oktober.2006, 16:50.
    Re: Bestenliste ausgeben fasst geschaft

      Oder effizienter:

       foreach $k (sort {$best{$b}<=>$best{$a}} keys %best)
      

      ;-)

     Antworten

    Beitrag von Sander (8133 Beiträge) am Donnerstag, 5.Oktober.2006, 16:59.
    Re: Bestenliste ausgeben fasst geschaft

      aja...

     Antworten

    Beitrag von mk (966 Beiträge) am Donnerstag, 5.Oktober.2006, 17:15.
    Re: Bestenliste ausgeben geschaft

      Danke,
      mal sehen ob ich den Rest selber hinbekomme.

      Michael

     Antworten

    Beitrag von Claus (4645 Beiträge) am Donnerstag, 5.Oktober.2006, 16:07. WWW: jobmarder.de
    Re: Bestenliste ausgeben

      die Antwort auf diese Frage hätte er dann auch hier (gerade vor ein paar Tagen beantwortet) gefunden.;-))

      Gruß

      Claus

     Antworten

    Beitrag von mk (966 Beiträge) am Donnerstag, 9.November.2006, 20:22.
    Re: Bestenliste ausgeben

      Hallo,

      die Ermitlung der bestenliste dauert wie vor einfach mittlerweile zu lange bei ca. 8500 Datensätzen.
      Also wollte ich das doch wieder etwas kleiner und schneller machen.
      der Lösungsansatz von cb geht nicht so recht:
      <perl>
      ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)= gmtime(time);
      $sid_neu=(((($year*365)+$yday)*24+$hour)*60+$min)*60+$sec ;
      $sid_zeit=($sid_neu-(3600*24)) ;#der letzte Tage
       get "name==$name sid>$sid_zeit", "richtig";
       while(get_next "richtig")
       {
         $best{$name}=$_amount;
       }
       foreach $k(sort{$best{$b}<=>$best{$a}} keys %best)
       {
         out "$k => $best{$k}<br>";
       }
      out "<br>Ausführungszeit: ".runtime;
      </perl>
      
      alle haben die gleiche Anzahl.
      warum?
      http://www.kochhome.de/cgi-bin/baseportal.pl?htx=/kochhome.de/vokabeltrainer/best

      Michael

     Antworten

    Beitrag von mk (966 Beiträge) am Sonntag, 12.November.2006, 12:10.
    Re: Bestenliste ausgeben

      noch mal nach oben gerückt.

      hab eben wieder ne Weile probiert,
      krieg es aber nicht hin.
      Die Besten der letzten 24 h haben bei mir leider alle die gleiche Punktezahl.

      Michael

     Antworten

    Beitrag von mk (966 Beiträge) am Montag, 13.November.2006, 19:14.
    Re: Bestenliste Optimierung

      Hallo,
      der Code von Sander den ich verwendet habe ist viel zu langsam,
      0,7 bis 1,.. ist nicht tragbar,
      der von cb würde 10x so schnell sein, wenn er gehen würde.

      ich bitte um Hilfe

      Michael

     Antworten

    Beitrag von Claus (4645 Beiträge) am Dienstag, 14.November.2006, 00:15. WWW: jobmarder.de
    Re: Bestenliste Optimierung

      Hallo Michael,

      Das hier ist jetzt nicht persönlich!!, sondern mal ganz allgemein von mir geäußert.

      Auch auf die Gefahr hin, mich mal wieder unbeliebt zu machen (irgend ein Nörgler wird sich schon melden).

      Das Forum dient eigentlich der Hilfe zur Selbsthilfe (von Till schon oft angesprochen!)
      Die Hilfe ist mal umfangreicher, aber manchmal eben auch nur auf Tips begrenzt.(Je nachdem, wer gerade, wenn überhaupt einer, antwortet)

      Es ist weder Aufgabe von baseportal noch von usern, hier komplette Lösungen ins Forum zu stellen (auch wenn man das ab und an mal macht).

      Baseportal ist eine, für Anfänger relativ einfach zu bedienende Internetdatenbank, die mit Wissen und Können (das setzt übrigens Lernbereitschaft voraus) im Gegensatz zu SQL auch für professionelle Anwender und Anwendungen viele Vorteile bietet.

      Wer dazu selbst nicht in der Lage ist oder keine Lust hat, Zeit zum Lernen zu investieren, kann dafür gegen Entgelt Jemanden beauftragen. Es gibt hier im forum Einige, die das machen. Keine Werkstatt, kein Architekt und kein Lehrer arbeitet umsonst.

      Ist nur die bescheidenen Meinung eines Einzelnen.

      Gruß

      Claus

     Antworten


     
 Liste der Einträge von 16201 bis 16351:Einklappen Zur Eingabe 
Neueste Einträge << 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | Neuere Einträge < Zur Eingabe  > Ältere Einträge | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 >> Älteste Einträge


Zurück zur Homepage

© baseportal.de. Alle Rechte vorbehalten. Nutzungsbedingungen



powered in 0.05s by baseportal.de
Erstellen Sie Ihre eigene Web-Datenbank - kostenlos!