2009-03-29 13 views
0

ich drei Tabellen, die wie folgt strukturiert sind: http://i41.tinypic.com/2bt9aq.pngMysql Abfrage nicht funktioniert

Was ich versuche, den Witz-ID, Titel und durchschnittliche Bewertung aller Witze in einer bestimmten Kategorie und um sie zu tun ist, abrufen alphabetisch. Ich habe diese Abfrage:

$result = mysql_query(" 
SELECT jokedata.id AS joke_id, 
jokedata.joketitle AS joke_title, 
SUM(ratings.rating)/COUNT(ratings.rating) AS average 
FROM jokedata 
INNER JOIN ratings ON ratings.content_type = 'joke' AND ratings.relative_id = jokedata.id 
WHERE jokecategory = '$cur_category' 
GROUP BY jokedata.id 
ORDER BY jokedata.joketitle 
LIMIT $offset, $jokes_per_page 
"); 

Allerdings ist es keine Witze auswählen.

Was ist falsch an dieser Abfrage? Vielen Dank.

Antwort

0

Ein innerer Join gibt keine Zeile zurück, wenn einer der Joins nicht erfüllt werden kann. Daher sind die Chancen gut, dass das Kriterium ratings.relative_id = jokedata.id die Abfrage veranlasst, 0 Witze zurückzugeben. Versuchen Sie, die INNER JOIN durch LEFT JOIN zu ersetzen, und Sie werden sehen, wie viele der jokedata Zeilen nicht übereinstimmen id in ratings.relative_id.

1

Zuerst möchten Sie wahrscheinlich AVG() anstelle von SUM()/COUNT() verwenden.

Ihr Problem ist die innere Verbindung - wenn keine Bewertungen für einen Witz eingereicht wurden, dann würde dieser Witz nicht zurückgegeben werden, da nur Witze mit einem Rating-Wert der inneren Verbindung entsprechen.

Ich würde empfehlen, stattdessen eine linke Verknüpfung oder sogar eine Unterauswahl zu verwenden. Während ich JOIN s normalerweise bevorzugen, da sie in der Regel schneller sind, würde ich so etwas wie dies versucht haben:

SELECT id AS joke_id, 
joketitle AS joke_title, 
(
    SELECT AVG(rating) AS avgrating FROM ratings 
    WHERE content_type = 'joke' AND relative_id = joke_id 
    GROUP BY relative_id 
) AS average 
FROM jokedata 
WHERE jokecategory = '$cur_category' 
GROUP BY id 
ORDER BY joketitle 
LIMIT $offset, $jokes_per_page 
0

verengen würde ich zuerst das Problem, indem alles außer dem Join herausnehmen und sehen, was das Ergebnis ist:

SELECT * FROM jokedata INNER JOIN Bewertungen auf ratings.content_type = 'Witz' AND ratings.relative_id = jokedata.id

Wenn dies Sie Ergebnisse gibt, würde ich dann in den WHERE Kriterien hinzufügen zurück. Führen Sie dies Schritt für Schritt durch, und wenn Sie eine Abfrage erhalten, bei der keine Zeilen zurückgegeben wurden, sehen Sie sich die vorherigen Ergebnisse an und überlegen Sie, was passiert, wenn Sie die zusätzlichen Kriterien hinzufügen. Wenn Sie diese "Zwischenergebnisse" sehen, können Sie das Problem leichter erkennen und verstehen.

Fügen Sie Stück für Stück zurück zur Abfrage hinzu, bis Sie keine Ergebnisse erhalten, zumindest haben Sie sich darauf beschränkt, welchen Aspekt der Abfrage das Problem verursacht.

Verwandte Themen