Beitrag von mk (966 Beiträge) am Mittwoch, 4.Oktober.2006, 19:54.
Bestenliste ausgeben
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
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
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
Antworten
Beitrag von mk (966 Beiträge) am Donnerstag, 5.Oktober.2006, 20:58.
Re: Bestenliste ausgeben
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;-)
Antworten
Beitrag von mk (966 Beiträge) am Freitag, 6.Oktober.2006, 09:10.
Re: Bestenliste ausgebenNachtrag;-)
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
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
Antworten
Beitrag von Christoph Bergmann (8110 Beiträge) am Donnerstag, 5.Oktober.2006, 16:50.
Re: Bestenliste ausgeben fasst geschaft
Antworten
Beitrag von Sander (8133 Beiträge) am Donnerstag, 5.Oktober.2006, 16:59.
Re: Bestenliste ausgeben fasst geschaft
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