php - Mysql - Laravel - order by 和 rownum 位置在 2 个查询中不同步

标签 php mysql sql-order-by laravel-5 rownum

所以我有一个收到投票的用户列表,他们按投票 DESC 排序,但随后我有另一个查询来获取他们当前的位置,即第一名、第二名、第十名等。

问题是当人们拥有相同的票数时,位置与他们出现的顺序不同步,

例如,在第 130 位获得 1 票的用户将出现在在第 125 位获得 1 票的另一个用户之前。

这不是一个大问题,但却是一个非常烦人的问题,有没有一种有效的方法来处理这个问题?我想过计算位置并将其存储为一列,但问题是每次投票后我都必须重新计算每个人的位置,这效率太低了。

这是两个查询:

// get the list of participants ordered by votes DESC
Participant::with('user')
                  ->where('contest_id', $cid)->orderBy('vote_count', 'DESC')
                  ->paginate(28);

// get the position of a participant
\DB::select(
            'SELECT position FROM
              (SELECT user_id, @rownum := @rownum + 1 as position 
              FROM contest_participants 
              JOIN (SELECT @rownum := 0) r 
              WHERE contest_id = ? ORDER BY vote_count DESC) b 
              WHERE user_id = ?', [$cid, $pid]);

最佳答案

我认为您可以通过两个条件进行排序,例如ORDER BY vote_count DESC, user_id ASC。如果我没记错的话。

关于php - Mysql - Laravel - order by 和 rownum 位置在 2 个查询中不同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30897807/

相关文章:

MySQL按id选择不同的顺序

mysql - 计算并最小化行大小以绕过有效的 MySQL 列限制

mysql - 如何在 MySQL 中匹配带有转义引号字符的字符串?

php - Memcached不保存生成的数据

mysql - 如何按多个时间戳字段排序并按时间顺序返回它们?

php - 对于 php flush - 如何禁用特定文件的 gzip?

php - 使用 for 循环插入多行

php - 如何在 php 输出中添加一个 id 标签?

php - Preg_match 从一些数字中删除最后的零

MySQL:如何 GROUP BY 一个字段来检索具有 ORDER BY 另一个字段的行?