以下查询用于获取特定博客文章的所有评论并且运行良好。我现在在我的博客中添加了一个成员信誉点系统,类似于 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)
如果有人能帮助我回到正确的道路上,我将不胜感激......
最佳答案
这是我注意到的几件事。
首先,您的 where 子句要求 comment.article_id,您没有将其包含在帖子底部的表结构中。我将假设您刚刚遗漏了它,但我想我还是会指出来。
如果两个表中的列名相同,您还可以通过指定 USING 而不是 ON 来简化联接。
要考虑的另一件事是表之间的关系类型。如果它是一对一的关系,那么连接就很简单。如果它是一对多或多对多,则连接会变得更加复杂,您必须正确地将它们组合在一起。我将假设每个评论只有一个成员,并且每个成员可能有多个代表。
最后,您有一个与表别名(注释)共享名称的列。如果您的 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&”代表什么?
关于mysql - SQL - 连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9477366/