2009-03-29 2 views
0

У меня есть три таблицы, которые структурированы так: http://i41.tinypic.com/2bt9aq.pngMysql Query не работает

То, что я пытаюсь сделать, это извлечь шуткой идентификатор, название, и средний рейтинг всех шуток в определенной категории и заказать их в алфавитном порядке. У меня есть этот вопрос:

$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 JOIN на LEFT JOIN, и вы увидите, сколько строк jokedata не соответствует id в ratings.relative_id.

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 
0

Я бы первым сужать проблему, вынимая все, кроме присоединиться и посмотреть, что результат:

SELECT * FROM jokedata INNER JOIN рейтинги ratings.content_type = 'шутка' И ratings.relative_id = jokedata.id

Если это дает результаты, я бы затем добавить обратно в критерии WHERE. Делайте это шаг за шагом, и всякий раз, когда вы получаете запрос, в котором нет возвращенных строк, посмотрите на предыдущий набор результатов и подумайте о том, что происходит, когда вы добавляете дополнительные критерии. Возможность увидеть этот «промежуточный» набор результатов поможет вам определить и понять проблему.

Продолжайте добавлять к запросу кусочно-мудрый, пока не начнете получать какие-либо результаты, по крайней мере, тогда вы сузились до того, какой аспект запроса вызывает проблему.