如何在两种情况下组合来自2个表的数据?

时间:2010-01-10 00:46:43

标签: sql mysql database

我有2张桌子。一个表包含帖子,另一个表包含帖子的投票。每个成员都可以为每个帖子投票(+或 - )。 (结构示例:)

  • 帖子表:pid,belongs,userp,text。
  • 投票表:vid,userv,postid,vote。

还有一个表,其中包含用户的信息。

我想要的是:假设我是登录成员。我想展示所有帖子,而那些我已经投票的帖子,不要让我再次投票。 (并告诉我我投了什么+或 - )

我现在所做的非常糟糕,因为它会进行大量查询:

SELECT `posts`.*, `users`.`username` 
FROM `posts`,`users` 
WHERE `posts`.belongs=$taken_from_url AND `users`.`usernumber`=`posts`.`userp` 
ORDER BY `posts`.`pid` DESC;

然后:

foreach ($query as $result) {if (logged_in) {select vote from votes....etc} }

所以,这意味着如果我登录并显示30个帖子,那么它将执行30个查询以检查我投票的每个帖子以及我投票的内容。我的问题是,我可以通过加入(我猜)以及如何做到更短吗? (我已经尝试了一些东西,但没有成功)

1 个答案:

答案 0 :(得分:0)

首先我要说的是,如果你要为登录的用户输出明显不同的输出,那么只需要有两个查询,而不是试图创建一些非常复杂的东西。

其次,这应该做你想要的事情:

SELECT p.*, u.username,
  (SELECT SUM(vote) FROM votes WHERE postid = p.pid) total_votes,
  (SELECT vote FROM votes WHERE postid = p.pid AND userv = $logged_in_user_id) my_vote
FROM posts p
JOIN users u ON p.userp = u.usernumber
WHERE p.belongs = $taken_from_url
ORDER BY p.pid DESC

注意:您没有说出投票表的值是什么。我假设它是+1(向上)或-1(向下),所以你可以通过将它们相加来轻松找到总票数。如果你不这样做,我建议你这样做,让你的生活更轻松。

可以通过JOINGROUP BY来消除第一个相关子查询,但我倾向于发现上述形式更具可读性。

所以这样做是因为它将用户加入帖子,就像你正在做的那样,除了它使用JOIN语法(这再次归结为可读性)。然后它有两个子查询:第一个查找该特定帖子的总票数,第二个查找特定用户的投票结果:

  • +1:up vote;
  • -1:向下投票;
  • NULL:没有投票。