komplizierte(?) MySQL-Abfrage
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anzahl
avg
beispiel
beitrag
bewertung
comment
count
datei
daten
durchschnittlichen bewertung
funktion
id
miteinader
raten
rating
spalt
tabelle
track
user
username
-
Tach,
ich verzweifle gerade an einer MySQL-Abfrage:
Ich habe drei Tabellen.
- Dateien
- Kommentare zu den Dateien
- (Punkt-)Bewertungen der Dateien
Jetzt m?chte ich eine Abfrage, die eine Tabelle mit allen Dateien, den dazugeh?rigen Daten, der Anzahl der Kommentare und der durchschnittlichen Bewertung zur?ck gibt.
Ich habs erst mit Joins gemacht, aber da kriege ich die Anzahl der Kommentare nicht raus, weil sich die Tabellen ja multiplizieren und somit Anzahl Bewertungen * Anzahl Kommentare raus kommt.
Ich bitte um Hilfe! -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
ISt schon mit Count, z?hlt aber zu viel ...
Ein Beispiel w?re folgendes:
(tracker-sounds_ext_tracks beinhaltet die Dateien
tracker-sounds_users beinhaltet die User, von denen die Dateien sind
tracker-sounds_ext_com beinhaltet die Kommentare
tracker-sounds_ext_vote beinhaltet die Bewertungen)
SELECT `tracks`.*, `users`.`name` AS `username`, COUNT(`com`.`id`) AS `com`, ROUND((SUM(`vote`.`vote`)-COUNT(`vote`.`vote`))/COUNT(`vote`.`vote`),1) AS `votes`
FROM `tracker-sounds_ext_tracks` AS `tracks`
JOIN `tracker-sounds_users` AS `users` ON `tracks`.`userid`=`users`.`id`
LEFT JOIN `tracker-sounds_ext_com` AS `com` ON `com`.`trackid`=`tracks`.`id`
LEFT JOIN `tracker-sounds_ext_vote` AS `vote` ON `vote`.`trackid`=`tracks`.`id`
WHERE 1
GROUP BY `tracks`.`id`
ORDER BY `time` DESC
LIMIT 0,25;
Jetzt wird das aber alles Gejoint und dann gez?hlt. Das hei?t, dass die Kommentare und die Bewertungen (miteinader multipliziert) gez?hlt werden.
Beitrag ge?ndert am 14.03.2006 16:41 von phattek -
bladehunter schrieb:
Es muss ein Primary Key auf id jeder Tabelle liegen.
SELECT datei.name, count(comments.text), avg(ratings.rate) FROM datei, comments, ratings WHERE (comments.datei=datei.id) AND (ratings.rate_id=datei.id)
Ich konnte es jetzt nicht testen. Hoffe, es ist richtig.
Kommt das Gleiche raus wie bei meinem Query. Da alle Spalten mit allen kombiniert werden multiplizieren sich die Kommentare mit den Bewertungen.
Edit: Ahh, jetzt hab ich's:
Man kann die COUNT-Funktion anweisen nur unterschiedliche Werte zu z?hlen. Da die IDs immer unterschierdlich sind kann man das also so machen:
COUNT(DISTINCT `table`.`id`) AS `anzahl`
und es ist egal, ob manche IDs mehrfach vorkommen.
Beitrag ge?ndert am 19.03.2006 15:29 von phattek -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage