【问题标题】:MySQL: Pulling the current user's vote on a query of linksMySQL:拉当前用户对链接查询的投票
【发布时间】:2009-12-03 06:48:13
【问题描述】:

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

一些笔记

  1. 所有链接都会自动启动,当前用户至少投过一票
  2. 在链接上投票然后取消选择该投票的用户将保持该投票条目的增量为 0

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。

【问题讨论】:

  • 我建议您使用带有 ON 子句而不是 WHERE 子句的常规 JOIN 语法,因为这样会更快...

标签: php mysql


【解决方案1】:

我真的不确定你在问什么,但听起来你想保留你已经返回的信息,并简单地用与每个链接的当前用户相关的投票总和来增加它。

如果是这样,那么应该这样做:

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 

【讨论】:

  • 我怎么夸你都不够!这正是我所需要的!
  • 你投一个不存在的投票0也很完美!这简直是​​天才!
【解决方案2】:

这是一种可以加快速度的方法:如果您需要经常显示每个链接的分数,并且您对链接的投票频率不高,我会按以下方式对数据结构进行非规范化:

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

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

【讨论】:

  • 我希望有一天我的网站会足够受欢迎,而我实际上必须这样做:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-26
  • 2015-06-25
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多