0

我有三个结构如下的表:http: //i41.tinypic.com/2bt9aq.png

我要做的是检索某个类别中所有笑话的笑话 ID、标题和平均评分,并按字母顺序排列它们。我有这个查询:

$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
");

但是,它没有选择任何笑话。

该查询有什么问题?谢谢你。

4

3 回答 3

1

首先,您可能想要使用AVG()而不是SUM()/COUNT().

您的问题是内部联接 - 如果没有为笑话提交评分,则不会返回该笑话,因为只有评分值与内部联接匹配的笑话。

我建议改用左连接,甚至是子选择。虽然我通常更喜欢JOINs 因为它们通常更快,但我会尝试这样的事情:

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
于 2009-03-29T07:40:18.533 回答
0

如果无法完成其中一个连接,则内部连接将不会返回一行。因此,标准ratings.relative_id = jokedata.id导致查询返回 0 个笑话的可能性很大。尝试替换INNER JOINwith LEFT JOIN,您会看到有多少jokedata' 行没有匹配id的 ' in ratings.relative_id

于 2009-03-29T07:36:56.547 回答
0

我将首先通过取出除连接之外的所有内容并查看结果来缩小问题范围:

SELECT * FROM jokedata INNER JOIN rating ON rating.content_type = 'joke' AND rating.relative_id = jokedata.id

如果这给了你结果,我会添加回 WHERE 标准。一步一步地执行此操作,每当您获得没有返回行的查询时,请查看前一组结果,并考虑添加其他条件时发生的情况。能够看到这组“中间”结果将帮助您识别和理解问题。

继续逐段添加回查询,直到您开始没有结果,至少您已经缩小到查询的哪个方面导致问题。

于 2009-03-29T08:35:12.367 回答