Php MySQL:在链接查询中获取当前用户的投票

Php MySQL:在链接查询中获取当前用户的投票,php,mysql,Php,Mysql,所以我有一个从我的链接和投票表中提取的查询,我需要最后一列数据。我的投票表由每个用户的投票组成,每个链接用户只能投票一次,其投票值为-1、0或1。投票表中有一个user_id外键,我想以某种方式收集当前用户的投票。我觉得当前查询的复杂性可能需要第二次查询,但如果可能的话,我真的希望避免这种情况。我只需要知道当前登录用户的投票是什么。链接永远不会有超过一个投票值,因为用户只能对链接投票一次 一些注释 所有链接都会自动启动,当前用户至少有一个投票条目 在链接上投票的用户然后取消选择该投票将使该投票条

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

一些注释

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


虽然优化很好,但现在我只想让指定用户获得选中的链接karma_delta。

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

在链接表上创建一个名为current score的列 无论何时修改投票表,都要更新当前分数 如果您担心这两者不同步,请运行一个守护程序,用所有投票的聚合覆盖当前分数的值。
然后,显示每个链接的分数非常快;当然,您在这里支付的成本是在投票时,您要做两次插入/更新,而不是一次,以及一些额外的复杂性

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

如果是这样的话,那么像这样的事情应该可以做到:

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 

我建议您在ON子句中使用常规的JOIN语法,而不要使用WHERE子句,因为这样会更快…我对您的赞扬还不够!这正是我需要的!你投了一张不存在的票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