从一个MySQL表中获取条目,可选地在其他表中计算相应的ID

时间:2014-06-04 21:42:04

标签: php mysql sql database

我试图找到一个解决方案很长一段时间,阅读了很多关于PIVOT,JOIN等的话题,但似乎仍然无法找到解决方案,所以我真的需要你的帮助。 / p>

我正在编写一个竖起/竖起系统的评论。所以,我想列出我的所有评论及其当前的投票总和,并显示我是否(在comments_votes表中的userID)已经投票,以及所有这些,如果可能(我假设)在一个SQL查询中。

我有两个MySQL表:

1)评论

  • commentID
  • 评论
  • 用户ID
  • topicID

2)comments_votes

  • commentID
  • 用户ID
  • 投票(= 1或-1,拇指向上或向下)。

<<<<<第1部分:总投票额>>>>>

在第一部分中,我想显示所有投票的当前总和,即该特定评论ID的SUM(投票)。投票金额可能适用于每条评论,即使评论尚未收到任何投票(因此,如果该评论ID的第二个表中没有条目)。因此,如果comments_vote表中该注释的条目为零,则投票总和为0。

我在这里遇到的一个主要问题是,我不仅希望获得投票的评论!这就是为什么两个表之间的简单“,”和a.commentID = b.commentID不起作用的原因(因为那个只返回了匹配两个表条目的那些)。对于数据透视表我从来没有真正得到它的工作。 JOIN功能似乎也不起作用。知道如何解决这个问题吗?

<<<<<第2部分:我已经投了票吗? >>>>>

因此,对于第二部分,我想确定我的userID是否已经在每个评论的comments_votes表中。在某种程度上,如果我已经投票赞成该评论,我将无法通过PHP / HTML再次投票。

-

现在,我通过使用一个Mysql while(...)然后在这个循环中使用两个函数来实现它,这当然是一个可怕的解决方案,因为它会杀死网站速度。我的目标是在一个SQL查询中获得所有这些,或者如果更快的话,可以使用其他替代方法。我需要运行最快的解决方案。

非常感谢您的帮助!非常感谢!!

2 个答案:

答案 0 :(得分:1)

我认为这应该有效:

select
  c.commentID
, sum(case when cvuser.vote is null then ifnull(cv.vote,0) else 0 end) commentScore
, sum(case when cvuser.vote is null then abs(ifnull(cv.vote,0)) else 0 end) totalCommentScore
, sum(ifnull(cvuser.vote,0))!=0 userHasVoted -- 1 if user has voted, 0 if has not voted
from
  comments c
  left outer join comments_votes cv using (commentID)
  left outer join comments_votes cvuser on c.commentID=cvuser.commentID and cv.userID=<INSERT USER ID HERE>
group by c.commentID

答案 1 :(得分:0)

第1部分: 逗号和JOIN方法都引用了一个名为“INNER JOIN”的更具体的SQL函数,它只返回共享记录。如果要将所有一个表和另一个表的一部分带回来,则需要LEFT JOIN或RIGHT JOIN。

这是我见过的关于联接的最佳资源:Visual Representation of Joins

第2部分: 如果您只是执行SELECT * WHERE user_id = [您的用户ID],那么您应该没问题。如果速度确实是一个问题,请考虑在数据库的user_id列上执行列索引。这应该可以消除任何速度问题。