Hilfe bei Ranking / MYSQL!

Bash, Shell, PHP, Python, Perl, CGI
dognose
Posts: 36
Joined: 2003-10-29 18:00

Hilfe bei Ranking / MYSQL!

Post by dognose »

Sers Leute.

Ich hab da n Problem. Ich habe ne Bilder Gallerie auf meiner Seite,
und möchte dafür n Ranking erstellen. Das ganze hat wunderbar geklappt
(Wert durchschnitt bestimmung pro Bild, etc.)

Nun wollte ich (da meine Gallerie wächst) eine "Top-Liste" erstellen.

Die Tabellenstruktur sieht so aus:

Code: Select all

+----------+-----------+----------------+
|vote_id   |bild_id    |points          |
+----------+-----------+----------------+
Hier mal n Paar beispiel daten:

Code: Select all

+----------+-----------+----------------+
|1         |18         |10              |
|2         |254        |9               |
|3         |254        |4               |
|4         |18         |10              |
|5         |254        |8               |
+----------+-----------+----------------+
-------usw-------

Nun sollte ich irgendwie Die Gesamten Punkte pro Bild ermitteln,
durch die Anzahl Votes ("mysql_num_rows($result)", oder?) teilen,
und dann noch von denen irgendwie die größte Zahl ermitteln.

Hat jemand ne Ahnung, wie ich das Anstellen könnte?

Hab mit PHP schon einiges am hut, aber das macht mich a bissle confus...
oxygen
Posts: 2138
Joined: 2002-12-15 00:10
Location: Bergheim

Re: Hilfe bei Ranking / MYSQL!

Post by oxygen »

Hm, also ohne einen Subselect wüsste ich auch nicht wie man das lösen sollte.
arty
Userprojekt
Userprojekt
Posts: 729
Joined: 2002-06-12 10:11

Re: Hilfe bei Ranking / MYSQL!

Post by arty »

dognose wrote:Hat jemand ne Ahnung, wie ich das Anstellen könnte?
Stichwort JOIN.

bye
arty
oxygen
Posts: 2138
Joined: 2002-12-15 00:10
Location: Bergheim

Re: Hilfe bei Ranking / MYSQL!

Post by oxygen »

Wenn das die einzige Tabelle ist, wird das aber ziemlich schwierig ...
dognose
Posts: 36
Joined: 2003-10-29 18:00

Re: Hilfe bei Ranking / MYSQL!

Post by dognose »

Hab ne andere IDEE!

Ich erstell noch ne Reihe .. in der VOR jedem Vote das Gesamt erg.
ausgelesen wird, die gevotete Zahl addiert, und wieder gespeichert wird.
Nun brauch ich nur noch Die Anzahl der Votes "zählen" und das "gesamt erg." durch diese Zahl teilen, und voila hab ich den Durchschnit...

müsste gehen, wenns klappt post ich den Code nochmal .

greeetz!
marsupilami
Posts: 20
Joined: 2004-01-31 19:13
Location: Böblingen

Re: Hilfe bei Ranking / MYSQL!

Post by marsupilami »

Code: Select all

SELECT MIN(key_part2) as Minimum,MAX(key_part2) as Maximum,AVG(key_part2) as Durchschnitt  FROM table_name where key_part1=XX
Das isn MySQL-Befehl, der tut jeweils von der Spalte "key_part2" das Maxiumum, das Minimum und den Durchschnitt auslesen.
kenshinxl
Posts: 17
Joined: 2004-05-05 14:28

Re: Hilfe bei Ranking / MYSQL!

Post by kenshinxl »

Oder ne ganz banale Lösung: wie wäre es mit einer Kombination aus SQL Abfrage, in Arrays einlesen, sortieren, dann wärs danach ja auch kein Problem mehr, mit Min, Max, Durchschnitt zu erhalten...

@MaRsuPiLaMi: das mit MIN MAX und AVG wusste ich gar nicht, find ich cool was man hier so alles lernt :)
dognose
Posts: 36
Joined: 2003-10-29 18:00

Re: Hilfe bei Ranking / MYSQL!

Post by dognose »

Fett. Das hätte mein Problem gelöst, aber egal, denke so ists auch gut:

Tabbellen Struktur sieht nun so aus:

Code: Select all

id   |   pic_id    |     ip      |    voters     |    points    |  average    
Den Code fürs posten:
ganz oben:

Code: Select all

<?
If($action=="vote" and $exist>="1")
	{
	$points_insert=$points+$points_update_value;          //alter wert + neuer wert
	$voters_insert=$voters+1;                          //natürlich ein Voter mehr!
	$average=$points_insert/$voters_insert;           //     natürlich den durchschnitt aber vom NEUEN wert, deshalb _insert!
		
	$sql = "UPDATE ppz_voting SET                           // Updaten in die Tabbele!
					 			points='$points_insert',
								ip='$ip',
								voters='$voters_insert',
								average='$average' where pic_id='$picid'";
	$result  = mysql_db_query($db_name,$sql);
	}
	?>	
	<?
If($action=="vote" and $exist=="0")
	{
	$points_insert=$points_update_value;                  // bei neu anlegen ist natürlich gesamt = erster Vote
	$voters_insert="1";                                           // natürlich nur ein Voter !!
	$average=$points_insert/$voters_insert;             // Durchscnitt natürlich ! 
	$sql = "INSERT INTO ppz_voting                        // diesmal nicht updaten , sondern natürlich neu anlegen da.... exist = 0(pic_id,points,ip,voters,average)values('$picid','$points_insert','$ip','$voters_insert','$average')";
	mysql_db_query($db_name, $sql);
}?>

Nun kommen wir zum Kernstück: Das Vote Formular!!
Ist n bissle Müll mit zwischen drin, aber so tuts *g*

erstmal die Auslesung, obs schon n Vote zu dem Pic gibt:
Ich setze die Variable $exist einfach gleich der Anzahl MYSQL Rows.

Code: Select all


	<?
			$sql 	 = "SELECT * FROM ppz_voting where pic_id='$bilder_id'"; 
			$result  = mysql_db_query($db_name,$sql);
			while ($zeile = mysql_fetch_array($result))
				{
 				$points= $zeile["points"];
				$last_ip= $zeile["ip"];
				$voters=$zeile["voters"];
				$average= $zeile["average"];
				}
			$exist = mysql_num_rows($result);
			
			?>
Nun wird , abhängig von der Anzahl an MYSQL rows entweder der durchschnitt angegeben, oder auch nicht ...

Code: Select all

					<?IF($exist > 0)
						{
						?>Schnitt: <b><?echo substr($average, 0, 3)?></b> Punkte mit <?echo $voters?> Stimmen&nbsp;&nbsp;<?}?>
						<?
						IF($exist == 0)
						{
						$points="0";
						$voters="0";
						$average="0";
						?>
						Leider Keine Punkte&nbsp;&nbsp;
						<?}?>	
Zu guter Letzt der kern vom Formular:

Weiter gabe der werte , damit die Bedingungen im Header zutreffen, und gevotet wird.

Natürlich wird überprüft, ob die letzte IP mit der IP des aktuellen Voters übereinstimmt, und wenn ja, gibts halt kein Vote button!!

Code: Select all

<form action="pics.php" target="_self" enctype="multipart/form-data">
						<input name="exist" type="hidden" value="<?echo $exist?>">
						<input name="color" type="hidden" value="<?echo $color?>">
						<input name="action" type="hidden" value="vote">
						<table border=0><tr><td width="398" background=""  height="25">
						<input type="radio" name="points_update_value" value="1">1&nbsp;|
						<input type="radio" name="points_update_value" value="2">2&nbsp;|
						<input type="radio" name="points_update_value" value="3">3&nbsp;|
						<input type="radio" name="points_update_value" value="4">4&nbsp;|
						<input type="radio" name="points_update_value" value="5">5&nbsp;|
						<input type="radio" name="points_update_value" value="6">6&nbsp;|
						<input type="radio" name="points_update_value" value="7">7&nbsp;|
						<input type="radio" name="points_update_value" value="8">8&nbsp;|
						<input type="radio" name="points_update_value" value="9">9&nbsp;|
						<input type="radio" name="points_update_value" value="10">10<br>
<input name="last_ip" type="hidden" value="<?echo $last_ip?>">
						<input name="points" type="hidden" value="<?echo $points?>">
						<input name="voters" type="hidden" value="<?echo $voters?>">
						<input name="low_limes" type="hidden" value="<?echo $low_limes?>">
						<input name="ip" type="hidden" value="<?echo $ip?>">
						<input name="kom_party" type="hidden" value="<?echo $party_short?>">
						<input name="kom_bild" type="hidden" value="<?echo $bilder_id?>">
						<input name="picid" type="hidden" value="<?echo $bilder_id?>">
						<input name="party_short" type="hidden" value="<?echo $party_short?>">
						<?IF ($last_ip!=$ip){?>
						<input type="submit" value="voten!">
						<?}?>
						<?IF ($last_ip==$ip){?>
						<b><font face="Arial, Helvetica, sans-serif" size=1 color=black>Du hast bereits für dieses Bild gevotet!</b></font>
						<?}?>
					</form>	
Falls ihr euch das ganze mal angucken wollt, hier der LINK, und einfach eins von den Pics auswählen !!!

Danke für alle Hilfen und Tipps!!!!

h**p://ufc.ngz-server.de/ppz/index.php?content=tmfh&color=blue

ps.: Ist ne Seite mit party pics ! Hier von ner Auto-Tuning-Messe!
dognose
Posts: 36
Joined: 2003-10-29 18:00

Re: Hilfe bei Ranking / MYSQL!

Post by dognose »

ach ja :

die eigentl. Top Liste sieht nun so aus (zumind. der MYSQL Code)

Code: Select all

<?	
						$sql1 	 = "SELECT * FROM ppz_voting order by average DESC LIMIT 0,15"; 
						$result1  = mysql_db_query($db_name,$sql1);
						While ($zeile1 = mysql_fetch_array($result1))
							{
							$pic_id= $zeile1["pic_id"];
							$voters= $zeile1["voters"];
							$points= $zeile1["points"];
							$average= $zeile1["average"];
						$rank++;
						?>