MySQL:拉取当前用户对链接查询的投票

时间:2009-12-02 22:20:58

标签: php mysql

所以我有这个查询从我的链接和投票表中提取,我需要最后一列数据。我的投票表包括每个用户的投票,用户每个链接只能投票一次,他们的投票值是-1,0或1.投票表中有一个user_id外键,我想以某种方式收集当前用户的投票。我觉得当前查询的复杂性可能需要第二个查询,但我真的希望尽可能避免这种情况。我只需要知道当前登录用户的投票是什么。链接永远不会有多个投票值,因为用户只能对链接进行一次投票。

一些注意事项

  
      
  1. 所有链接自动启动,当前用户至少有一个投票条目
  2.   
  3. 对链接进行投票的用户然后取消选择该投票将使该投票条目保持为0 delta
  4.   

SQL:

SELECT links.*, (SUM(votes.karma_delta)) AS karma
FROM links, votes
WHERE links.id = votes.link_id
GROUP BY votes.link_id
ORDER BY (SUM(votes.karma_delta) - 1) / POW((TIMESTAMPDIFF(HOUR, links.created, NOW()) + 2), 1.5) DESC
LIMIT 0, 100

虽然优化很棒,但现在我只想让指定用户选择链接karma_delta。

2 个答案:

答案 0 :(得分:0)

以下是提高速度的一种方法:如果您需要经常显示每个链接的分数,并且不经常对链接进行投票,我会按以下方式对数据结构进行反规范化: / p>

  • 在链接表上创建名为“current score”的列
  • 每当您对投票表进行修改时,也会更新当前分数
  • 如果您担心两者不同步,请运行一个守护程序,该守护程序将使用“所有投票的聚合”覆盖当前分数的值。

然后,显示每个链接的分数是超快的;当然,你在这里支付的费用是在投票时间(你正在做两次插入/更新而不是一次),以及一些额外的复杂性。

答案 1 :(得分:0)

我真的不确定你在问什么,但听起来你想要保留你已经返回的信息,只需用每个链接的当前用户的投票总数来增加它。

如果是这种情况,那么这样的事情就应该这样做:

SELECT links.*, 
       SUM(votes.karma_delta) AS karma,
       SUM(
           IF(votes.user_id = current_user_id, 
              votes.karma_delta, 
              0)
          ) AS user_vote
FROM links, votes
WHERE links.id = votes.link_id
GROUP BY votes.link_id
ORDER BY (SUM(votes.karma_delta) - 1) / 
         POW(
              TIMESTAMPDIFF(HOUR, links.created, NOW()) + 2, 
              1.5
            ) DESC
LIMIT 0, 100