MySQL-Abfrage mit Subquery - nur wie?
David S.
- datenbank
0 globe
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
n'abend,
Ich habe es wiefolgt versucht:
SELECT * FROM content WHEREid
IN (SELECT content_id FROM rating ORDER BYpoints
DESC LIMIT 5)
Falls da eine Fehlermeldung kommt, solltest du die dazu packen.
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...