繁体   English   中英

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

[英]PHP + mySQL - Getting a shared position of row after count query

因此,我试图在我的市场站点上的面板中显示每个卖方的个人排名。 对于这个特定的排名,我要计算每个卖家有多少追随者,以降序排列列表,然后获得每个追随者的位置,以便他们知道自己的排名。 我正在使用一个有效的查询,除了当两个卖方的追随者数量相同时,情况每次都会改变。 当大量卖家具有相同数量的追随者时,这尤其麻烦。

查询(在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";
?>

其中$vendorId =当前卖方的ID。

因此,再次,主要问题是,如果有10个卖家,并且其中7个都有1个关注者。 卖家每次刷新时,都会看到4-10之间的排名。 我只想对拥有1个关注者的所有卖家说4个。

更新:以下查询已经给出了我想要的内容,尽管我仍然希望将工作负载推向PHP,而不是将其全部保留在MySQL上。

<?php
    $connection->query("SET @curRank:=1, @prevRank:=0, @incRank=1;");

    $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(1) AS followers
    FROM $favTable
            GROUP BY vendor_id
    ORDER BY followers DESC, vendor_id DESC
        ) as sq,
        (SELECT @rank:=0) AS tr
     ) as q WHERE vendor_id = $vendorId";

    $result = $connection->fetchOne($query);

您走在正确的道路上。 您只需要在查询中添加更多的变量。 您可以尝试以下方法:

<?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提到的更具体的排序顺序,以获得一致的有序行。 当排序中使用的字段具有相同的值时,mysql可能根据其自身的排序逻辑返回行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM