Topliste (Top 100) - 10 Fotos pro Seite

proloser

Erfahrenes Mitglied
Hallo,
ich hab folgendes Problem und zwar können User mehrere Fotos hochladen, in der Topliste wird aber nur das best bewertet Foto angezeigt.

Das funktioniert super aber jetzt möchte ich damit immer nur 10 Fotos pro seite angezeigt werden.
Wie mach ich das am besten?

PHP:
$alte_id = array();
  
$i = 0;
    
$res = mysql_query("SELECT *, voting/rating AS rate FROM `photos` WHERE `user_id` in (SELECT `id` FROM `user`) ORDER BY `rate` DESC");
    	
while($row = mysql_fetch_array($res)){ 
  	
  $i++;
  	
  if( !(in_array( $row['user_id'], $alte_id )) ) {	  		 	  	 	  
    ## Mein Code ###
       	
  }
  	
  $alte_id[$i] = $row['user_id']; 

}


Ich hab schon verschiedenes ausprobiert, komm aber leider nicht drauf.

MfG
Proloser
 
Hab ich schon versucht aber das Funktioniert nicht.
Mit LIMIT bekomm ich eine falsche ausgabe, wegen der "Array -> alte_id" Abfrage.
 
Wo ist denn das Problem?

Zuerst einmal Fotos zählen.
Aufrunden(Anzahl / 10) = Anzahl der Seiten.
Per Get die Seitenid übergeben.
!isset(GET) dann Seitenid = 0
Beim Seitenaufbau Fotos zwischen Seite * 10 und Seite * 10 + 9 wählen. Geht mit Limit im Sql.
Beispiel: Seite = 2, es werden die Ergebnisse 2 * 10 = 20 bis 2 * 10 = 20 + 9 = 29 gewählt.
In einer for die Links mit ihren GET-Werten generieren.

Das wars im Groben, event. zwischendurch noch Prüfen ob der GET-Inhalt gültig ist und so. Hab lange nichtmehr in PHP gearbeitet, deshalb errinnere ich mich an diese Sicherheitssachen nicht mehr so gut.
Ach ja, du musst die Ausgabe nach irgendwas (z. B. ID ordnen), sonst können manche Fotos doppelt vorkommen.
 
Das Problem liegt darin damit die Anzahl vom mysql_query nicht gleich ist wie die Anzahl der Fotos, die ausgegeben werden.

Wegen:

PHP:
if( !(in_array( $row['user_id'], $alte_id )) )
 
Hi,

Hab ich schon versucht aber das Funktioniert nicht.
Mit LIMIT bekomm ich eine falsche ausgabe, wegen der "Array -> alte_id" Abfrage.

Die Logik könntest Du doch gleich in die Abfrage packen:

Code:
SELECT *, MAX(voting/rating) AS rate 
   FROM `photos` 
   WHERE `user_id` in (SELECT `id` FROM `user`) 
   GROUP BY `user_id`
   ORDER BY `rate` DESC

Dann liefert die DB genau die Datensätze, die Du willst und Du musst hinterher nicht mehr filtern... ;)

Wozu ist eigentlich die Subquery gut? Du schränkst ja nicht auf bestimmte Benutzer ein.

LG
 
Mit "GROUP" hab ich es auch schon versucht, allerdings funktioniert dann das sortieren nach "rate" nicht. Warum ist mir allerdings auch unklar.

Wozu ist eigentlich die Subquery gut? Du schränkst ja nicht auf bestimmte Benutzer ein.

Ich frage in der Subquery noch ab damit nur Fotos von Usern angezeigt werden die sich innerhab X Tagen eingeloggt haben. (Wegen der Übersucht weggelassen)

LG
 
Zuletzt bearbeitet:
Hi,

die Sortierung sollte passen. Ich habe nur nicht daran gedacht, dass Du in den Feldern, nach denen nicht gruppiert wurde, zufällige Werte bekommst... :-(
Das lässt sich aber durch einen JOIN lösen. Versuch es mal so ungefähr:

Code:
SELECT * FROM `photos` t1
   INNER JOIN 
      (SELECT *, MAX(voting/rating) AS `rate` 
      FROM `photos` 
      WHERE `user_id` in (SELECT `id` FROM `user`) 
      GROUP BY `user_id`
      ORDER BY `rate` DESC) t2 
   ON t1.user_id = t2.user_id AND t1.voting/t1.rating = t2.rate

LG
 
Hi,

ups, im Subquery darf natürlich nur die user_id mit ausgewählt werden, das ist ja der Grund für die zufälligen Feldinhalte gewesen:

Code:
SELECT * FROM `photos` t1
   INNER JOIN 
      (SELECT `user_id`, MAX(voting/rating) AS `rate` 
      FROM `photos` 
      WHERE `user_id` in (SELECT `id` FROM `user`) 
      GROUP BY `user_id`
      ORDER BY `rate` DESC) t2 
   ON t1.user_id = t2.user_id AND t1.voting/t1.rating = t2.rate

Du darfst übrigens gerne mitdenken... ;)

LG
 

Neue Beiträge

Zurück