SQL - объединение таблиц - PullRequest
       2

SQL - объединение таблиц

1 голос
/ 28 февраля 2012

Следующий запрос использовался для получения всех комментариев к определенной статье блога и работал хорошо. Теперь я добавил в свой блог систему очков репутации участников, аналогичную системе репутации Stack Overflow, и попытался изменить этот запрос, чтобы получать очки репутации из таблицы members_reputation, чтобы рядом с именем пользователя отображался каждый комментарий.

Я подумал, что добавление SUM (rep.points) AS member_rep и добавление LEFT JOIN в таблицу репутации поможет, но я получаю странные результаты, слишком странные для описания. На самом деле, одно забавное поведение заключается в том, что не все комментарии возвращаются. Где, если я удалил свою попытку решения, все комментарии возвращаются, но мне нужно посчитать / показать их репутацию

Каждый комментарий имеет члена, и каждый участник имеет репутацию.

SELECT comment.comment_id, comment.member_id, comment.comment,
comment.posted, member.screen_name, member.country_code, SUM(rep.points) AS member_rep
FROM blog_comments AS comment
LEFT JOIN members AS member ON comment.member_id = member.member_id

// my attempt start //
LEFT JOIN members_reputation AS rep ON comment.member_id = rep.member_id
// my attempt end //

WHERE comment.article_id = "&article_id&"
ORDER BY comment.comment_id DESC

Структура БД

comments              :    comment_id, member_id, comment, posted
members               :    member_id, screen_name, country_code
members_reputation    :    member_id, activity_type, points

Что я хочу увидеть

This is a posted comment on my blog. Cool huh?
25/02/2012 By Martin G **850** (GBR)

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

1 Ответ

1 голос
/ 28 февраля 2012

Вот пара вещей, которые я заметил.

Во-первых, в предложении where запрашивается комментарий comment.article_id, который вы не включили в структуру таблицы в нижней части своего поста. Я собираюсь сделать предположение, что вы только что это упустили, но решили, что все равно укажу.

Вы также можете упростить свои объединения, указав ИСПОЛЬЗОВАНИЕ вместо ВКЛ, если имя столбца в обеих таблицах одинаковое.

Еще одна вещь, которую следует учитывать, - это тип взаимоотношений между таблицами. Если это отношения один к одному, то соединения просты. Если это один ко многим или много ко многим, то объединения становятся более сложными, и вам нужно правильно их группировать. Я предполагаю, что у каждого комментария есть только один участник, и у каждого участника может быть более одного представителя.

Наконец, у вас есть столбец, который разделяет имя с псевдонимом таблицы (комментарий). Это может привести к проблемам, если ваш синтаксис sql даже позволяет.

Это то, что я бы использовал сам:

SELECT c.comment_id, c.member_id, c.comment, c.posted, m.screen_name, m.country_code
       SUM(r.points) `member_rep`
FROM blog_comments `c`
LEFT JOIN members `m` USING (member_id)
LEFT JOIN members_reputation `r` USING (member_id)
WHERE c.article_id = "&article_id&"
ORDER BY c.comment_id DESC

Также: что означает "& article_id &"?

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