如果数据库的数据库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
答案 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')
在此查询中包含id
和points
并没有任何意义。它将简单地从具有比给定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演示: