kostenloser Webspace werbefrei: lima-city


komplizierte(?) MySQL-Abfrage

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    phattek

    Kostenloser Webspace von phattek

    phattek hat kostenlosen Webspace.

    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!
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Gibt es f?r MySQL nicht "COUNT ()"?
    Probier mal irgendwie "COUNT (spalte)". Vllt klappt sowas in der Art ja.
    Ansonsten poste mal dein jetztiges Query, dann muss man nicht alles neu schreiben. ;-)

    MfG Lucas
  4. Autor dieses Themas

    phattek

    Kostenloser Webspace von phattek

    phattek hat kostenlosen Webspace.

    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
  5. 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.
  6. Autor dieses Themas

    phattek

    Kostenloser Webspace von phattek

    phattek hat kostenlosen Webspace.

    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
  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!