所以我有这个查询从我的链接和投票表中提取,我需要最后一列数据。我的投票表包括每个用户的投票,用户每个链接只能投票一次,他们的投票值是-1,0或1.投票表中有一个user_id外键,我想以某种方式收集当前用户的投票。我觉得当前查询的复杂性可能需要第二个查询,但我真的希望尽可能避免这种情况。我只需要知道当前登录用户的投票是什么。链接永远不会有多个投票值,因为用户只能对链接进行一次投票。
一些注意事项
- 所有链接自动启动,当前用户至少有一个投票条目
- 对链接进行投票的用户然后取消选择该投票将使该投票条目保持为0 delta
醇>
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。
答案 0 :(得分:0)
以下是提高速度的一种方法:如果您需要经常显示每个链接的分数,并且不经常对链接进行投票,我会按以下方式对数据结构进行反规范化: / p>
然后,显示每个链接的分数是超快的;当然,你在这里支付的费用是在投票时间(你正在做两次插入/更新而不是一次),以及一些额外的复杂性。
答案 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