SQL Abfrage mit AVG()?

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Candy
Mitglied
Beiträge: 314
Registriert: 09.11.2002 21:15

SQL Abfrage mit AVG()?

Beitrag von Candy »

Hi,
ich habe eine sql abfrage mit der ich einige Infos aus 2 tabellen auslese zusätzlich dazu wollte ich jetzt aus einer 3 tabelle in der bewertungsergebnisse gespeichert sind den durchschnitt dieser auslesen:

Code: Alles auswählen

$sql = "SELECT *, AVG(r.rate_point) as rating
FROM " . ALBUM_TABLE . " a
LEFT JOIN " .ALBUM_CAT_TABLE ." ac ON ac.cat_id = a.pic_cat_id
LEFT JOIN " . ALBUM_RATE_TABLE . " r ON r.rate_pic_id = a.pic_id
WHERE a.pic_id = $pic_id
ORDER BY $order_by
LIMIT " . $start . ", " . $board_config['topics_per_page'];
aber das funktioniert irgendwie nicht ich bekomme ne fehlermeldung:
SQL Error : 1140 Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns is illegal if there is no GROUP BY clause

SELECT *, AVG(r.rate_point) as rating FROM phpbb_album a LEFT JOIN phpbb_album_cat ac ON ac.cat_id = a.pic_cat_id LEFT JOIN phpbb_album_rate r ON r.rate_pic_id = a.pic_id WHERE a.pic_id = 4 ORDER BY a.pic_username DESC LIMIT 0, 5
Hat jemand ne idee wie ich das richtig hinbekommen kann??

Grüße Candy
Acid
Ehrenadmin
Beiträge: 12195
Registriert: 26.04.2001 02:00
Wohnort: Berlin

Beitrag von Acid »

..und wenn du ORDER BY mit GROUP BY ersetzt ?
Candy
Mitglied
Beiträge: 314
Registriert: 09.11.2002 21:15

Beitrag von Candy »

Danke dir aber das geht leider auch nicht dann gibts ne fehlermeldung weil $order_by ja z.b. pic_title DESC enthält :-?

Candy
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Wenn du kein GROUP BY angibst, ist das avg() doch auch sinnlos. Beispiel:

Code: Alles auswählen

BildID  | Punkte
--------+--------
 1      | 6
 1      | 4
 2      | 7
 2      | 3
SELECT BildID, avg(Punkte) FROM bilder würde das genau das Ergebnis geben wie der Tabelleninhalt.

SELECT BildID, avg(Punkte) FROM bilder GROUP BY BildID Ergibt das richtige Ergebnis, weil zuerst nach BildID gruppiert wird, so daß die Punkte-Spalte dann intern je 2 Werte Enthält, von welchen der Durchschnitt ermittelt werden kann.

http://www.mysql.com/doc/en/GROUP-BY-Functions.html
Candy
Mitglied
Beiträge: 314
Registriert: 09.11.2002 21:15

Beitrag von Candy »

Hi,
danke für die erklärung @Pyramide so hab sogar ich es verstanden und nu funzelt es einwandfrei :)

Noch eine frage GROUP By ist aber nur notwendig wenn ich aus 2 oder mehreren tabellen etwas auslese oder?Weil wenn ich nur aus der tabelle phpbb_album_rate die durchschnittliche Bewertung auslese also so:

Code: Alles auswählen

$sql = "SELECT AVG(rating) as average, MIN(rating) as min, MAX(rating) as max, COUNT(rating) as number_of_rates
        FROM " . ALBUM_RATE_TABLE . "
        WHERE pic_id = $pic_id";
Grüße Candy
Candy
Mitglied
Beiträge: 314
Registriert: 09.11.2002 21:15

Beitrag von Candy »

Hab da grade nochmal ne frage wollte deswegen jetzt kein neues Thema aufmachen weils mit diesem script zu tun hat :) Gibt es eine möglichkeit nach der bewertung zu sortieren?Ich habs schon so probiert:
$sql = "SELECT a.*,ac.*, AVG(r.rate_point) as rating
FROM " . ALBUM_TABLE . " a
LEFT JOIN " .ALBUM_CAT_TABLE ." ac ON ac.cat_id = a.pic_cat_id
LEFT JOIN " . ALBUM_RATE_TABLE . " r ON r.rate_pic_id = a.pic_id
WHERE a.pic_id = $pic_id
ORDER BY rating DESC
GROUP BY a.pic_id
LIMIT " . $start . ", " . $board_config['topics_per_page'];
aber das funzt nicht so sind die bewerteten immer am ende aufgelistet egal ob Absteigend/Aufsteigend sortiert :(

Grüße Candy
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Candy hat geschrieben:Noch eine frage GROUP By ist aber nur notwendig wenn ich aus 2 oder mehreren tabellen etwas auslese oder?
GROUP BY ist notwendig, wenn du
Mixing of GROUP columns (MIN(),MAX(),COUNT()...) with no GROUP columns
In deiner Abfrage sind aber nur "GROUP columns", d.h. du brauchst auch kein GROUP BY.

Zur Sortierfrage: Versuch mal SELECT ..., IFNULL(AVG(r.rate_point), 0) as rating FROM ...
Antworten

Zurück zu „Coding & Technik“