PHP + mySQL - 在计数查询后获取行的共享位置

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (58)

所以我试图在我的市场网站上显示每个卖家的个别等级。对于这个特定的排名,我计算每个卖家有多少粉丝,按降序排列列表,然后获取每个人的位置,以便他们知道排名的位置。我正在使用一个有效的查询,除非两个卖家拥有相同数量的关注者,每次都会改变位置。当有大量卖家拥有相同数量的粉丝时,这尤其令人烦恼。

查询(在PHP中):

<?php 
    $query = "SELECT rank
        FROM (
          SELECT vendor_id, followers, @rank:=@rank+1 AS rank
          FROM (
            SELECT vendor_id, COUNT(*) AS followers
            FROM $table
            GROUP BY vendor_id
            ORDER BY followers DESC
           ) as sq,
            (SELECT @rank:=0) AS tr
          ) as q WHERE vendor_id = $vendorId";
?>

where $vendorId=当前卖家的ID。

因此,主要问题是,如果有10个卖家,其中7个都有1个追随者。每次卖家刷新时,他们都会看到4-10的排名。我想对所有拥有1个粉丝的卖家说4。

提问于
用户回答回答于

要获得一致的位置,您需要做的就是使您的排序更具体,例如,按顺序添加ID,而不仅仅是关注者。这样你就可以获得一致的结果。

接下来将最小数字作为碰撞结果集中的位置获得也不是那么困难:再次对您寻求获得排名的ID进行排序将首先按照您的顺序排序。

用户回答回答于

你是在正确的道路上。您只需在查询中添加几个变量。您可以尝试以下方法:

<?php 
$query = "SELECT rank
    FROM (
      SELECT vendor_id, followers,
          @curRank := IF(@prevRank = followers, @curRank, @incRank) AS rank, 
          @incRank := @incRank + 1, 
          @prevRank := followers
      FROM (
        SELECT vendor_id, COUNT(*) AS followers
        FROM $table
        GROUP BY vendor_id
        ORDER BY followers DESC, vendor_id
       ) as sq,
        (SELECT @rank:=0) AS tr
      ) as q WHERE vendor_id = $vendorId";
?>

请添加@ swa66提到的更具体的排序顺序,以获得一致的有序行。当sort中使用的字段具有相同的值时,mysql可能会根据自己的排序逻辑返回行。

扫码关注云+社区

领取腾讯云代金券