擅长:python、mysql、java
<p>我建议您将前三个步骤(成就、其他别名、计数)作为一个单独的SQL语句执行。现在,您正在使用Python发出大量查询并汇总数千行,这是一项应该委托给DB的任务。例如代码</p>
<pre><code>for otherAlias in otherAliases : #For every single other user
for otherAch in otherAlias.achievements.all() : #execute a query
r[otherAch] = r.get(otherAch, 0) + 1
</code></pre>
<p>执行数千个巨大的查询。在</p>
<p>相反,您可以使用SQL来实现这一点,方法是根据Alias id的不同和成就id的相同,在其自身上加入Achiever。然后按成就id分组并进行计数。在</p>
<p>在下面的查询中,表“B”是其他用户的成果,“Achiever”是我们的成果。如果任何其他用户共享一个成果,他们在“B”中为他们共享的每个成果显示一次。然后,我们根据alias_id对它们进行分组,并计算它们出现的次数,这样就可以得到一个很好的id,count table out。在</p>
<p>非常粗糙的代码(这里没有SQL)</p>
^{pr2}$
<p>如果这是我认为的那样,你将得到一个其他用户别名的表,以及他们与当前用户共享的成果的数量。在</p>
<p>接下来要做的是一个SQL语句,它将上面的语句用作“内部选择”—称之为用户。将其与当前用户的成就表和成就表相关联。您可能希望忽略除前10个与当前用户相似的用户之外的所有用户。在</p>
<p>我现在没有时间写一个好的查询,但是看看你的数据库的JOIN语句,该语句连接指定的10个用户和当前用户之间的achievement_id-如果该id不存在,则将其设置为NULL。过滤器只对结果为空(未实现的成就)的行执行。在</p>