你好 StackOverflow 社区:
情况
我正在构建一个更新查询,根据每条记录相互比较的方式为表中的所有记录设置排名。表格示例:
id | budget | cost | rank | rank_score
1 | 500 | 20 | ? | ?
2 | 400 | 40 | ? | ?
3 | 300 | 40 | ? | ?
所以在这个表中,cost
决定排名的权重最大,其次budget
。因此,记录#2 将排名更高,而记录#3 将排在第二位,而#1 将排在最后。如您所见,如果两条记录具有相同的cost
,则budget
打破平局。
现在,为了轻松跟踪这种“权重”,我正在创建rank_score
列,它将保存cost
and的连接budget
。因此,rank_score
对于上表将是:
id | budget | cost | rank | rank_score
1 | 500 | 20 | ? | 20500
2 | 400 | 40 | ? | 40400
3 | 300 | 40 | ? | 40300
这rank_score
可以像这样填充:
UPDATE table_name
SET rank_score = CONCAT(cost, budget);
问题
到目前为止一切都很好。但现在问题来了。我需要一个仅整数rank
列来处理排序等一些内容,但最重要的是向用户显示其记录的排名。当然,这一rank
列将等于 rank_scores 的降序。但是我找不到rank
在单个更新查询中计算此列的方法,而无需在 php 中执行子查询、循环等。
我试过的
所以,起初我试图获取如下rank_score
计算:
SELECT id,
CONCAT(cost, budget) AS rank_score
FROM table_name ;
然后在 php 中循环所有这些 rank_scores,只是为了构建一个查询,如下所示:
UPDATE table_name
SET rank_score = CASE id WHEN 1 THEN 20500 END,
rank = CASE id WHEN 1 THEN 3 END
WHERE id IN (1) ;
... 当然,这个示例更新查询并不完整,因为它对WHEN THEN END
表中的每条记录都有更多的子句。不用说,这很难看,尤其是当您期望拥有成千上万条记录时。
所以,总而言之,我已经有了计算的方法rank_score
,但我也想rank
在同一个查询中计算(= 排名分数的降序),或者至少不做那个疯狂的 php 循环和CASE WHEN THEN END
子句。
感谢您阅读和思考这个;)
澄清
澄清@SJuan76 所说的内容:我无法通过 php 分配排名,因为在某些情况下,用户一次会看到固定数量的记录(例如,他的用户页面:SELECT * WHERE user_id = 333
,可以获取 1、3 或 8 条记录)和他需要知道每条记录的排名。在这种情况下,通过 php 分配排名不起作用,因为这样的排名将与获取的记录相关,而不是与表中的所有记录相关。