2009-03-29 13 views
0

を働いていない:私が何をしようとしています何 http://i41.tinypic.com/2bt9aq.pngMySQLのクエリは、私がこのように構成されている3つのテーブル持って

を冗談の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

ジョインのいずれかを実行できない場合、内部ジョインはローを返しません。したがって、基準ratings.relative_id = jokedata.idが0のジョークを返すようにクエリを実行している可能性があります。 INNER JOINLEFT JOINに置き換えてみてください。jokedataの行のうち、idが一致していない行の数がratings.relative_idに表示されます。

1

まず、SUM()/COUNT()の代わりにAVG()を使用します。

あなたの問題は内側のジョインです。ジョークのために提出された格付けがない場合、そのジョークは評価値が内部ジョインに一致するジョークだけとして返されません。

代わりに左の結合を使用することをお勧めします。

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

私が最初に参加する以外のすべてを取り出して、結果が何であるかを見て、問題を絞り込みます:

私は通常、彼らは通常より速くしているとして、私はこのような何かを試してみましたでしょう JOINのを好みます

SELECT * INNERがratings.content_type = 'ジョーク' ON評価を登録しようjokedata FROM とratings.relative_id = jokedata.id

これはあなたに結果を与える場合、私は当時WHERE条件で追加します。この手順をステップごとに実行し、返された行がないクエリを取得した場合は、以前の結果セットを見て、追加基準を追加するときに何が起きているのかを考えます。この "中間"の結果セットを見ることができれば、問題を特定し理解するのに役立ちます。

結果が表示されなくなるまで、クエリの一部を絞り込んで、問題の原因となっているクエリの種類を絞り込んでください。

関連する問題