php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 31.07.2006, 21:34  
Benutzer
 
Registriert seit: 18.09.2005
Beiträge: 47
Maho88
Standard best bewerteten Bilder auswählen

Hallo,
ich habe auf meiner Homepage eine Bildergalerie in der man die Bilder auch bewerten kann. In einer Tabelle speichere ich die Daten zu den Bildern:
pic_id | name | description | filepath | views

und in der anderen die Bewertungen:
pic_id | vote

Jetzt möchte ich die 3 am besten bewerteten Bilder auswählen. (Nach dem Durchschnitt der Bewertungen)
Ich hab aber überhaupt keine Ahnung wie dazu der Query aussehen muss...

Grüße
Alexander
Maho88 ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 31.07.2006, 21:47  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Ungetestet
SELECT pic_id, AVG(vote) FROM votes GROUP BY pic_id ORDER BY AVG(vote) DESC LIMIT 0, 3

Statt AVG(), dem Durchschnitt, kannst du auch SUM() verwenden. Das zählt dir die Punkte zusammen.
Da wäre aber ein Bild das 5x2 Punkte bekommen hat "besser" als eins das 1x9 Punkte bekommen hat.
Zergling-new ist offline   Mit Zitat antworten
Alt 31.07.2006, 22:58  
Moderator
 
Benutzerbild von agrajag
 
Registriert seit: 02.10.2006
Beiträge: 3.820
PHP-Kenntnisse:
Fortgeschritten
agrajag wird schon bald berühmt werdenagrajag wird schon bald berühmt werden
Standard

So bekommt er nur die IDs der bestbewerteten Bildern - ich schätze eher er scheitert daran, mit einer mysql_query-Abfrage gleich den Dateinamen/filepath zu bekommen....

eine Möglichkeit (auch ungetestet:
SELECT name, descritption, filepath FROM bilder WHERE pic_id IN(SELECT pic_id FROM votes GROUP BY pic_id ORDER BY AVG(vote) DESC LIMIT 0, 3)
__________________
Today you...Tomorrow me.
agrajag ist offline   Mit Zitat antworten
Alt 01.08.2006, 02:51  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von Werbegeschenk
So bekommt er nur die IDs der bestbewerteten Bildern -
Naja, wenn er kummulativ die votes zu jedem Bild speichern würde, wäre das kein Thema. Nicht jede Normalisierung ist auch sinnvoll.
  Mit Zitat antworten
Alt 01.08.2006, 08:19  
Erfahrener Benutzer
 
Registriert seit: 13.11.2005
Beiträge: 2.583
xabbuh
Standard

Zitat:
Zitat von Werbegeschenk
SELECT name, descritption, filepath FROM bilder WHERE pic_id IN(SELECT pic_id FROM votes GROUP BY pic_id ORDER BY AVG(vote) DESC LIMIT 0, 3)
Kannst du vergessen, da MySQL leider noch kein LIMIT in Subselects unterstützt. Die LIMIT-Klausel müsste also in der Hauptquery stehen und somit geht die komplette Performance bei sehr vielen Datensätzen wohl den Bach runter.

Der einzig sinnvolle Weg ist der von ignatz beschriebene.
xabbuh ist offline   Mit Zitat antworten
Alt 01.08.2006, 09:14  
Benutzer
 
Registriert seit: 18.09.2005
Beiträge: 47
Maho88
Standard

Zitat:
Zitat von ignatz
Zitat:
Zitat von Werbegeschenk
So bekommt er nur die IDs der bestbewerteten Bildern -
Naja, wenn er kummulativ die votes zu jedem Bild speichern würde, wäre das kein Thema. Nicht jede Normalisierung ist auch sinnvoll.
also in die Tabelle pics noch folgende Spalten?
pic_id | name | description | filepath | views | votes_sum | votes_number

Weil ich will ja nach der durchschnittlichen Bewertung sortieren. Wie muss dann der Query aussehen?
SELECT name, description, filepath FROM pics ORDER BY votes_sum / votes_number DESC LIMIT 3

Funktioniert das mit der Division in ORDER BY?
Maho88 ist offline   Mit Zitat antworten
Alt 01.08.2006, 09:23  
Erfahrener Benutzer
 
Registriert seit: 13.11.2005
Beiträge: 2.583
xabbuh
Standard

Ich habe mir gerade erst deinen Tabellenaufbau angesehen. Wenn man Zerglings Abfrage noch ein wenig erweitert, solltest du auch ohne Änderungen an der Struktur zur gewünschten Lösung kommen:
Code:
SELECT
    p.name,
    p.description,
    p.filepath
FROM
    pics AS p
INNER JOIN
    votes AS v
ON
    p.pic_id = v.pic_id
ORDER BY
    AVG(v.vote)
GROUP BY
    v.pic_id
LIMIT
    3
xabbuh ist offline   Mit Zitat antworten
Alt 01.08.2006, 10:23  
Benutzer
 
Registriert seit: 18.09.2005
Beiträge: 47
Maho88
Standard

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY v.pic_id LIMIT 3' at line 13

Was bewirkt eigentlich GROUP BY?
Maho88 ist offline   Mit Zitat antworten
Alt 01.08.2006, 10:28  
Erfahrener Benutzer
 
Registriert seit: 13.11.2005
Beiträge: 2.583
xabbuh
Standard

Ups, vertausche mal die GROUP BY- mit der ORDER BY-Klausel:
Code:
SELECT
    p.name,
    p.description,
    p.filepath
FROM
    pics AS p
INNER JOIN
    votes AS v
ON
    p.pic_id = v.pic_id
GROUP BY
    v.pic_id
ORDER BY
    AVG(v.vote)
LIMIT
    3
Zitat:
Zitat von Maho88
Was bewirkt eigentlich GROUP BY?
Mit GROUP BY werden, wie die Bezeichnung schon vermuten lässt, mehrere Datensätze gruppiert. Das ist wichtig, damit MySQL weiß, von welcher Gruppe an Datensätzen überhaupt der Durchschnitt bestimmt werden soll.
In diesem Fall soll also der Durchschnitt der Spalte vote ermittelt werden. Dabei werden die Datensätze anhand der Spalte pic_id gruppiert. Schließlich willst du den Durchschnitt ja für jedes Bild haben.
xabbuh ist offline   Mit Zitat antworten
Alt 01.08.2006, 12:45  
Benutzer
 
Registriert seit: 18.09.2005
Beiträge: 47
Maho88
Standard

scheint auch nicht zu funktionieren: Invalid use of group function
Maho88 ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Bilder ohne DB sicher speichern Diet PHP Tipps 2005 6 25.03.2009 00:07
Zip Archiv entpacken und Bilder verkleinern Simon9990 PHP Tipps 2008 5 08.10.2007 00:32
Bilder in HTML-Mails werden willkürlich "verissen" hoffnungsloser PHP-Fortgeschrittene 3 25.04.2007 14:48
bilder zu groß?! lindner PHP Tipps 2006 9 19.10.2006 08:32
Bilder löschen die öffter vorhanden sind?! Peoples PHP Tipps 2006 6 28.05.2006 19:34
Bilder "schützen" PHP Tipps 2006 4 06.03.2006 15:25
Bilder löschen PHP Tipps 2005-2 4 24.10.2005 11:37
Bilder aus einem unterverzeichis anzeigen.Hilfe PHP Tipps 2005-2 3 12.09.2005 15:36
Mehrere Bilder Hochladen und bearbeiten PHP Tipps 2005-2 7 23.07.2005 13:48
Bilder in Tabellen nixdorf HTML, Usability und Barrierefreiheit 36 09.05.2005 21:15
Bilder frei positionieren und von Text umfließen lassen. HTML, Usability und Barrierefreiheit 10 24.04.2005 00:05
Bilder nach Namen anzeigen PHP Tipps 2005 11 06.03.2005 15:41
Bilder aus der Datenbank Skazi Datenbanken 2 09.02.2005 13:42
Bilder upload (Massen) PHP Tipps 2005 11 06.01.2005 14:14
1000de bilder einfügen ab schnell..? :-) PHP Tipps 2004 12 11.08.2004 20:42

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
bilder auswählen, php bilder auswählen, meist bewerteten zitate, beim hochladen von bildern kommt: invalid use of group function, bilder auswählen php, bild auswählen php html, php bild wählen, php bilder auswahl markieren, select anstatt avg

Alle Zeitangaben in WEZ +1. Es ist jetzt 09:13 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.