如果数据库id中不存在,则不显示排名

lnxxn5zx  于 2021-06-17  发布在  Mysql
关注(0)|答案(9)|浏览(228)

如果数据库中的数据库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或最后一名
样本,排名显示
uid-----点------>等级
1

qpgpyjmq

qpgpyjmq2#

对你的问题唯一有意义的解释是你想找出一些人的分数排名 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演示:

演示

ezykj2lf

ezykj2lf6#

可能最简单的方法是添加 having 条款:

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

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

ulmd4ohb

ulmd4ohb8#

你可以用 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 选择列表中的列。

cgfeq70w

cgfeq70w9#

你可以用 CASE 当id不存在时返回默认值。

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')

演示
把它包括进去是没有意义的 id 以及 points 在此查询中。它只需从点数高于给定id的不可预测行中选取它们。

相关问题