0

次のような構造の 3 つのテーブルがあります: 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()

あなたの問題は内部結合です-ジョークに対して送信された評価がない場合、評価値を持つジョークのみが内部結合と一致するため、そのジョークは返されません。

代わりに左結合を使用するか、サブ選択を使用することをお勧めします。JOIN通常は高速であるため、通常は s を好みますが、次のようなことを試してみました。

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

結合の 1 つが満たされない場合、内部結合は行を返しません。ratings.relative_id = jokedata.idそのため、条件によってクエリが 0 個のジョークを返す可能性は十分にあります。を に置き換えてみるINNER JOINと、一致する が含まれていない の行がLEFT JOINいくつあるかがわかります。jokedataidratings.relative_id

于 2009-03-29T07:36:56.547 に答える
0

まず、結合以外のすべてを取り出して結果を確認することで、問題を絞り込みます。

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

これで結果が得られた場合は、WHERE 基準に追加し直します。これを段階的に実行し、行が返されないクエリを取得するたびに、前の結果セットを見て、追加の基準を追加するとどうなるかを考えてください。この「中間」の結果セットを確認できると、問題を特定して理解するのに役立ちます。

結果が得られなくなるまで、クエリにピースごとに追加し続けます。少なくとも、クエリのどの側面が問題を引き起こしているかを絞り込むことができます。

于 2009-03-29T08:35:12.367 に答える