2012-05-04 2 views
1

Я играл с LEFT JOINs, и мне интересно, можно ли получить SUM всех рейтингов до сих пор от всех пользователей в следующем запросе. Ниже приведена информация о том, был ли зарегистрированный пользователь зарегистрирован или нет, но я хочу показать общие оценки и от других пользователей.SUM() на всех строках LEFT JOIN?

$query = mysql_query(" 
SELECT com.comment, com.comment_id, r.rate_up, r.rate_down 
FROM comments com 
LEFT JOIN ratings r 
ON com.comment_id = r.comment_id 
AND r.user_id = '" . $user_id_var . "' 
WHERE page_id = '" . $category_id_var. "'"); 

Я пробовал следующее, но по какой-то причине я получил только один комментарий/строку.

$query = mysql_query(" 
SELECT com.comment, com.comment_id, 
r.rate_up, r.rate_down 
SUM(r.rate_up) AS total_up_ratings, 
SUM(r.rate_down) AS total_down_ratings, 
FROM comments com 
LEFT JOIN ratings r 
ON com.comment_id = r.comment_id 
AND r.user_id = '" . $user_id_var . "' 
WHERE page_id = '" . $category_id_var. "'"); 

Любая помощь оценена. Нужен ли мне другой вид JOIN?

ответ

0

Если вы используете функцию агрегации в SQL (например, SUM()), вам понадобится соответствующее предложение GROUP BY.

В вашем случае, скорее всего, будет com.comment_id; это даст вам сумму всех оценок за comment_id:

0

Вы могли бы сделать что-то вроде этого:

SELECT 
    com.comment, 
    com.comment_id, 
    Total.total_down_ratings, 
    Total.total_up_ratings 
FROM comments com 
LEFT JOIN 
(
SELECT 
    SUM(r.rate_up) AS total_up_ratings, 
    SUM(r.rate_down) AS total_down_ratings, 
    r.comment_id 
FROM 
    ratings r 
GROUP BY 
    r.comment_id 
) AS Total 
ON com.comment_id = Total.comment_id 
AND r.user_id = '" . $user_id_var . "' 
WHERE page_id = '" . $category_id_var. "'" 
1

Вы пробовали использовать GROUP BY page_id на конце вашего SQL?

0

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

select comment_id, user_id, sum(rate_up) as sum_rate_up, 
sum(rate_down) as sum_rate_down from ratings 
group_by comment_id, user_id; 

, а затем включить его в свой присоединиться к запросу:

select com.comment, com.comment_id, r.user_id, r.sum_rate_up, 
r.sum_rate_down from comments com 
left join (select comment_id, user_id, sum(rate_up) as sum_rate_up, 
sum(rate_down) as sum_rate_down from ratings 
group_by comment_id, user_id) as r 
on com.comment_id = r.comment_id where page_id = '".$category_id_var."' 
+0

Это, кажется, ближе всего. Функции, которые мне нужны, должны отображаться, если текущий пользователь оценил комментарий и общий рейтинг вверх и вниз всех, кто когда-либо оценивал этот комментарий. Вставка или удаление «where user_id =». $ User_id_var. «Кажется, получается тот или другой ... но не оба. – john

+0

проверить отредактированные запросы: я добавил 'group by comment_id, user_id', поэтому в подзапросе у вас есть оценки комментариев для каждого пользователя, которые оценивают этот комментарий. Целый запрос должен дать вам все комментарии и информацию, чтобы пользователи, оценившие эти комментарии. Затем вы можете искать в строках результата для текущего пользователя, чтобы узнать, оценил ли он конкретный комментарий. –

+0

По-прежнему не повезло. Разве запрос не нуждался бы в идентификаторе пользователя там? – john

Смежные вопросы