Mysql Query не работает - PullRequest
0 голосов
/ 29 марта 2009

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

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

$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
");

Однако шутки не выбираются.

Что не так с этим запросом? Thankyou.

Ответы [ 3 ]

1 голос
/ 29 марта 2009

Во-первых, вы, вероятно, хотите использовать 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 голосов
/ 29 марта 2009

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

ВЫБРАТЬ * ОТ Джокедата ВНУТРЕННИЕ РЕЙТИНГИ НА РЕЙТИНГЕ

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

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

0 голосов
/ 29 марта 2009

Внутреннее объединение не вернет строку, если одно из объединений не может быть выполнено. Таким образом, вероятность того, что критерий ratings.relative_id = jokedata.id вызывает запрос, возвращает 0 шуток. Попробуйте заменить INNER JOIN на LEFT JOIN, и вы увидите, сколько строк jokedata не имеют совпадений id в ratings.relative_id.

...