在mySQL中使用WHERE子句获取不正确的排名

在mySQL中使用WHERE子句获取不正确的排名,mysql,Mysql,在上面的SQL查询中,它返回的是第6级而不是第1级。我需要在SQL查询中做哪些更改,以便它提供第一级,因为我使用了WHERE条件来检查mpkid和RONDPKID(其中mpkid=37和RONDPKID=3) 以下是查询: SELECT mpkid, totalvote, rank FROM ( SELECT mpkid, roundpkid, totalvote, @n := IF(@g = totalvote, @n, @n + 1) rank, @g := totalvote

在上面的SQL查询中,它返回的是第6级而不是第1级。我需要在SQL查询中做哪些更改,以便它提供第一级,因为我使用了WHERE条件来检查mpkid和RONDPKID(其中mpkid=37和RONDPKID=3)

以下是查询:

SELECT mpkid, totalvote, rank 
FROM ( 
 SELECT mpkid, roundpkid, totalvote, 
 @n := IF(@g = totalvote, @n, @n + 1) rank, 
 @g := totalvote 
 FROM tr_msearch_vote_summary, 
 (SELECT @n := 0) i 
 ORDER BY totalvote DESC 
) q 
WHERE mpkid=37 AND roundpkid=3
我想要的是:


请先看小提琴。第三轮只有一个记录,它是37,所以我想它应该显示mpkid第37轮和第3轮的排名1,但它给出了排名6

排名完成后,您将应用WHERE条件。我猜你想在应用WHERE之后进行排名:

  SELECT t.mpkid, t.roundpkid,  
         @n := IF(@g = t.totalvote, @n, @n + 1) rank,
         @g := t.totalvote totalvote
    FROM tr_msearch_vote_summary t, (SELECT @n := 0) i 
   WHERE t.mpkid=37 AND t.roundpkid=3
ORDER BY t.totalvote DESC 
您还应初始化@g,以确保它未在另一个查询中预设:

  SELECT t.mpkid, t.roundpkid,  
         @n := IF(@g = t.totalvote, @n, @n + 1) rank,
         @g := t.totalvote totalvote
    FROM tr_msearch_vote_summary t, (SELECT @n := 0, @g := NULL) i 
   WHERE t.mpkid=37 AND t.roundpkid=3
ORDER BY t.totalvote DESC 
更新

如果您希望排名按轮分组,然后简单地按mpkid选择,这是一个更强大的查询:

SELECT mpkid,
       roundpkid,
       totalvote,
       rank
  FROM (
    SELECT t.mpkid,  
           @n := CASE 
                   WHEN @r = t.roundpkid AND @g = t.totalvote THEN @n
                   WHEN @r = t.roundpkid THEN @n + 1
                   ELSE 1
                 END rank,
           @r := t.roundpkid roundpkid,
           @g := t.totalvote totalvote
      FROM tr_msearch_vote_summary t, (SELECT @n := 0, @g := NULL, @r := NULL) i 
  ORDER BY t.roundpkid, t.totalvote DESC
       ) r
 WHERE mpkid = 37;
请注意,您不需要提供roundpkid

请尝试此查询

SELECT mpkid, totalvote, rank 
FROM ( 
  SELECT mpkid, roundpkid, totalvote, 
  @n := IF(@g = totalvote, @n, @n + 1) rank, 
  @g := totalvote 
  FROM tr_msearch_vote_summary, 
  (SELECT @n := 0) i 
WHERE roundpkid=3
ORDER BY totalvote DESC 
) q 
WHERE mpkid=37

这是你最新的sqlfiddle

最好在这里发布查询问题中发布的查询,请看一看。问题不是很清楚。你的比较参数是什么?你想要什么数据?@kamaldeep,我刚刚编辑了我的问题,并添加了更多关于我想要什么结果以及我现在得到什么的信息。这是意料之中的。您的排名是在子查询中生成的,然后您使用父/外部查询过滤这些结果-这意味着您将丢失任何不匹配的记录,并在排名值中获得差距。如果你想要连续的1,2,3,…-类型编号,你必须在外部查询中实现排名。啊,好的,你想要每轮排名。。知道了。请考虑初始化@ g。但是,你能解释<代码> @ n:=(@ g=全票,@ n,n+1)等级< /代码>这是什么意思?另外
(选择@n:=0)i
@kamaldeepsinghbhatia第一个跟踪变量@n中的排名,并为每行添加1(除非@g跟踪的总投票数与之前的行相同)。。第二个用交叉连接将@n初始化为0,这样加法计算正确,并且@n中存储的任何旧值都会被清除。@在这里,我们给出了三个逗号分隔的值来代替条件吗?我在这里感到困惑。@kamaldeepsinghbhatia
如果(*条件为真*,*返回此*,*否则返回此*)
或者在本例中。。如果总投票数相同,则保持排名相同,否则将排名增加1。