David S.: MySQL-Abfrage mit Subquery - nur wie?

Guten Abend!

Ich such für eine PHP-Funktion eine Datenbankabfrage, die mir Werte aus 2 Tabellen einer MySQL-DB liefert.

Meine 1. Tabelle hat (vereinfacht) folgende Struktur:

CREATE TABLE content (
  id int(10) unsigned NOT NULL auto_increment,
  name int(10) NOT NULL,
  PRIMARY KEY  (id)
)

Meine 2. Tabelle sieht wiefolgt aus:

CREATE TABLE rating (
  id int(10) unsigned NOT NULL auto_increment,
  content\_id int(10) NOT NULL,
  points tinyint(1) NOT NULL,
  PRIMARY KEY  (id)
)

Jetzt möchte ich aus der Tabelle content die 5 "am besten bewerteten" Inhalte auslesen - auf Grundlage der Bewertung in der Tabelle rating

Ich habe es wiefolgt versucht:

SELECT * FROM content WHERE id IN (SELECT content_id FROM rating ORDER BY points DESC LIMIT 5)

Trotz diverser Versuche bin ich bisher leider kläglich gescheitert.

Hat jemand einen Tipp für mich? Langsam verzweifel ich damit...

Vielen Dank!

MfG David

  1. n'abend,

    Ich habe es wiefolgt versucht:
    SELECT * FROM content WHERE id IN (SELECT content_id FROM rating ORDER BY points DESC LIMIT 5)

    Falls da eine Fehlermeldung kommt, solltest du die dazu packen.

    MySQL5 Subquery Errors

    MySQL kann mit der LIMIT-Klausel in Subqueries bisweilen noch nichts anfangen. Glücklicherweise können Subqueries aber auch in Form von JOINs dargestellt werden:

    SELECT *  
      FROM content c  
      JOIN rating r  
        ON r.content_id = c.id  
     ORDER BY r.points DESC  
     LIMIT 5;
    

    Ich habe aber das Gefühl, dass du pro Datensatz in der Tabelle content mehrere verknüpfte Datensätze in der Tabelle rating hast. Vermutlich willst du die 5 Datensätze aus content haben, mit der größten _Gesamtpunktzahl_:

    SELECT c.*, SUM(r.points) AS gesamtpunktzahl  
      FROM content c  
      JOIN rating r  
        ON r.content_id = c.id  
     GROUP BY r.content_id  
     ORDER BY gesamtpunktzahl DESC  
     LIMIT 5;
    

    oder auch so:

    SELECT c.*, r.gesamtpunkzahl  
      FROM content c  
      JOIN  
      (  
        SELECT content_id, SUM(points) AS gesamtpunktzahl  
          FROM rating  
         ORDER BY gesamtpunktzahl DESC  
         LIMIT 5  
      ) AS r  
        ON r.content_id = c.id;
    

    Die letzte Query ist völlig in Ordnung, auch wenn sie erst mal ungewohnt ausschaut. Es handelt sich hierbei auch nicht um eine Subquery, sondern mehr um einen "Temporären View".

    weiterhin schönen abend...

    --
    #selfhtml hat ein Forum?
    sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|