在哪里划分条款

时间:2015-07-16 06:36:13

标签: mysql

我的查询有问题。我想从我的排名查询中选择数据。 我的查询输出是Perfect Like:

------------------------------
 Rank | ID | Username | Value
-------------------------------
  1   | 5 | Julian    | 5000
  2   | 2 | Masha     | 2400
  3   | 4 | Misha     | 2300
  4   | 1 | Jackson   | 1900
  5   | 9 | Beruang   | 400
-------------------------------

但是当我选择ID = 4时,输出如下:

------------------------------
 Rank | ID | Username | Value
-------------------------------
  ***1***   | 4 | Misha     | 2300
-------------------------------

排名的输出是1而不是3。

我的查询是:

 SELECT @curRank := @curRank + 1 AS rank,
       a.id, a.username
FROM  partimer a CROSS JOIN
      (SELECT @curRank := 0) vars
# WHERE  a.id = 4
ORDER By id;

3 个答案:

答案 0 :(得分:0)

如果Rank是动态计算的,你可以这样做:

SELECT *
FROM (
  SELECT @curRank := @curRank + 1 AS rank
       , a.id
       , a.username
  FROM partimer a
  CROSS JOIN (SELECT @curRank := 0) vars
  ORDER BY value
) p
WHERE p.id = 4;

这样,您可以存储具有排名的临时表,然后从中进行选择。

答案 1 :(得分:0)

你应该喜欢这个

SELECT *
FROM (
     ...{your Query}...
) qry
WHERE  qry.id = 4 

答案 2 :(得分:0)

您的排名是在查询中动态计算的。这里的问题是这些动态计算在之后应用于where子句。换句话说,当MySQL执行您的查询时,它首先过滤掉所有符合where子句的行,然后才应用排名计算。在给定查询中,id=4行确实是遵循where子句的所有行之间的第1行。

获得所需行为的一种方法是首先执行原始查询,然后使用此查询作为子查询并将where子句应用于外部查询来过滤结果:

SELECT *
FROM   (SELECT     @curRank := @curRank + 1 AS rank, a.id, a.username
        FROM       partimer a 
        CROSS JOIN (SELECT @curRank := 0) vars
        ORDER By id) t
WHERE  id = 4