[英]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.