我有三个表格,结构如下: 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
");
然而,它没有选择任何笑话。
该查询有什么问题?三江源。
答案 0 :(得分:1)
首先,您可能希望使用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
答案 1 :(得分:0)
如果无法满足其中一个连接,则内连接不会返回一行。因此,标准ratings.relative_id = jokedata.id
导致查询返回0个笑话的可能性很大。尝试将INNER JOIN
替换为LEFT JOIN
,您会看到有多少jokedata
行在id
中没有匹配的ratings.relative_id
。
答案 2 :(得分:0)
我首先要通过取出除连接之外的所有内容并查看结果是什么来缩小问题范围:
SELECT * 来自jokedata INNER JOIN评级为ratings.content_type ='笑话'和ratings.relative_id = jokedata.id
如果这给你结果,我会在WHERE标准中加回。一步一步地执行此操作,并且每当您获得没有返回行的查询时,请查看上一组结果,并考虑添加其他条件时发生的情况。能够看到这个“中间”结果集将有助于您识别和理解问题。
继续逐步添加回查询,直到您开始没有结果,至少然后您已经缩小到查询导致问题的哪个方面。