如果数据库ID中不存在则不显示等级

时间:2018-12-29 23:39:29

标签: mysql

如果数据库的数据库ID中不存在,如何不显示排名

SQL代码:

$query = "SELECT id, points, count(*)+1 AS rank FROM weekly_points 
          WHERE points > (SELECT points FROM weekly_points 
            WHERE id='".$account['id']."'
    )";

不存在ID 15000的示例查询:

SELECT id,points,count(*)+1 as rank 
FROM weekly_points
WHERE points > (SELECT points FROM weekly_points WHERE id='15000')
-- output is rank 1 which is wrong

不存在ID,它显示排名1,但我不想不显示排名,或者是 9999999 最后一位 < / p>

示例,以显示排名

uid ------点----->等级

1 ---------- 100 ----- 5

2 ---------- 200 ------ 4

3 ---------- 1000 ---- 1

4 ---------- 300 ----- 3

5 ---------- 400 ----- 2

4 个答案:

答案 0 :(得分:3)

当ID不存在时,您可以使用CASE返回默认值。

SELECT id, points,
    CASE WHEN EXISTS (SELECT * FROM weekly_points WHERE id='15000')
         THEN COUNT(*) + 1
         ELSE 999999
    END AS rnk
FROM weekly_points
WHERE points > (SELECT points FROM weekly_points WHERE id='15000')

DEMO

在此查询中包含idpoints并没有任何意义。它将简单地从具有比给定ID高的不可预测行中选择它们。

答案 1 :(得分:0)

您可以在以下查询中使用EXISTS

SELECT id,points,count(*)+1 as rank 
  FROM weekly_points p1
 WHERE EXISTS ( SELECT 1 
                  FROM weekly_points p2
                 WHERE p2.id='".$account['id']."'
                   AND p2.id=p1.id);

,然后向屏幕显示$account['id']作为有效ID的信息,如果它没有为选择列表中的id列返回值。

答案 2 :(得分:0)

最简单的方法可能是添加一个having子句:

SELECT count(*)+1 as rank 
FROM weekly_points
WHERE points > (SELECT points FROM weekly_points WHERE id = '15000')
HAVING SUM(id = '15000') > 0;

您不应选择其他列,因为它们不是聚合的一部分。

答案 3 :(得分:0)

您的问题对我而言唯一有意义的解释是,您想找到某个id的得分排名,例如15000。在这种情况下,我们可以先尝试在一个单独的子查询中计算该id的点数,然后在整个表中进行汇总,计算具有比该特定id多的点的记录。

SELECT
    CASE WHEN wp2.points IS NOT NULL
         THEN COUNT(CASE WHEN wp1.points > wp2.points THEN 1 END) + 1
         ELSE 999999 END rnk
FROM weekly_points wp1
CROSS JOIN (SELECT points FROM weekly_points WHERE id = '15000') wp2;

使用相同的@Barmar演示:

Demo