2009-03-29 3 views
0

작동하지 : http://i41.tinypic.com/2bt9aq.pngMySQL의 쿼리 I는 다음과 같이 구성되어 세 개의 테이블이

내가 특정 카테고리 및 순서를 모든 농담 농담 아이디, 제목 및 평균 평가를 검색하면된다하려고 알파벳순으로. 다음 쿼리가 있습니다 :

$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()을 사용하고 싶을 것입니다.

문제는 내부 조인입니다. 농담으로 제출 된 등급이 없으면 등급 값이 내부 조인과 일치하는 농담만으로는 해당 농담이 반환되지 않습니다.

대신 왼쪽 결합 또는 하위 선택을 사용하는 것이 좋습니다. 그들은 일반적으로 더 빨리 나는 일반적으로 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 
0

내가 처음에 가입을 제외한 모든을 복용하고 그 결과가 무엇인지보고하여 문제를 좁힐 것이다 :

SELECT * INNER가 ratings.content_type = '농담'ON 등급을 가입 jokedata 로부터 및 ratings.relative_id = jokedata.id

이 당신에게 결과를 제공하는 경우, 그때 다시 WHERE 조건에 추가합니다. 이 단계를 단계별로 수행하고 반환 된 행이없는 쿼리를 얻을 때마다 이전 결과 집합을보고 추가 조건을 추가 할 때 발생하는 상황에 대해 생각하십시오. 이 "중간"결과 집합을 볼 수 있으면 문제를 식별하고 이해하는 데 도움이됩니다.

결과를 얻기 시작할 때까지 계속 쿼리에 다시 추가하십시오. 그런 다음 쿼리의 어떤 측면이 문제를 일으키는 지 최소한 좁혀 왔습니다.