English 中文(简体)
MySql查询不起作用。
原标题:
  • 时间:2009-03-29 07:13:34
  •  标签:

I have three tables that are structured like this: 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
");

然而它并没有选择任何笑话。

那个查询有什么问题?谢谢。

问题回答

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

你的问题在于内连接 - 如果没有人为某个笑话提交评分,则该笑话不会被返回,因为只有评分值匹配内连接的笑话才会被返回。

我建议使用左连接或子查询。虽然通常我更喜欢使用JOIN,因为它们通常更快,但我会尝试类似于这样的东西:

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

内连接如果其中一个连接无法实现,则不会返回行。因此很可能是 ratings.relative_id = jokedata.id 的条件导致查询返回0个笑话。尝试将 INNER JOIN 替换为 LEFT JOIN,您将看到有多少个 jokedata 的行没有与 ratings.relative_id 中的 id 匹配。

我会先排除除了连接以外的所有元素,看看结果是什么,以此来缩小问题范围。

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

如果这样做可以给你结果,那么我会逐步加入 WHERE 的限制条件。每一步都要小心,如果出现没有返回任何记录的情况,那么请看看前面的结果,并思考在添加附加条件时发生了什么。能够看到这些“中间”结果将有助于您识别和理解问题。

继续分段地将内容添加回查询,直到您不再获得结果为止,至少这样您就可以缩小查询问题的范围了。





相关问题
热门标签