将递增值合并到此 sql
Posted
技术标签:
【中文标题】将递增值合并到此 sql【英文标题】:Incorporating an incrementing value into this sql 【发布时间】:2013-11-16 07:23:27 【问题描述】:我正在尝试做类似question 中的第一个答案的事情,添加输出排名的@part
,不知何故我无法做到正确。
我使用的sql是:
select child.id, child.perCent
from likesd parent
join likesd child
on parent.id = child.parent
where parent.type = 3
order by parent.id, child.perCent desc;
我有些无法将@
部分放入上述 sql 中,需要帮助。
SELECT first_name, // This sql is from the previous question
age,
gender,
@curRank := @curRank + 1 AS rank
FROM person p, (SELECT @curRank := 0) r
ORDER BY age;
所以:
select child.id, child.perCent, @curRank := @curRank + AS rank
from likesd parent, (SELECT @curRank := 0) r
join likesd child
on parent.id = child.parent
where parent.type = 3
order by parent.id, child.perCent desc;
最后,我想要达到的目标是期望的结果。你知道我该怎么做吗?
主表
"id" "type" "parent" "country" "votes" "perCent"
"24" "1" "1" "US" "30" "0"
"25" "3" "24" "US" "30" "0"
"26" "10" "25" "US" "15" "50.00"
"27" "10" "25" "US" "10" "33.33"
"28" "10" "25" "US" "5" "16.66"
"29" "1" "1" "US" "50" "0"
"30" "3" "29" "US" "50" "0"
"31" "10" "30" "US" "20" "40.00"
"32" "10" "30" "US" "15" "25.00"
"33" "10" "30" "US" "15" "35.00"
预期结果:
"id" "perCent" "rank" // Rank is calculated based on the sql order above
"26" "50.00" "1"
"27" "33.33" "2"
"28" "16.66" "3"
"31" "40.00" "1" // New parent, new ranking
"33" "35.00" "2"
"32" "25.00" "3"
【问题讨论】:
为什么结果中会出现 31、32 和 33?他们的 parent = 29,其类型是 1,而不是 3。 @Barmar 对不起,我的错。我对数据进行了编辑。发布所有内容会让其他人感到困难。 【参考方案1】:select id, perCent,
@curRank := if(parent = @prevParent, @curRank + 1, 1) AS rank,
@prevParent := parent
from (
select child.id, child.perCent, child.parent
from likesd parent
join likesd child
on parent.id = child.parent
where parent.type = 3
order by parent.id, child.perCent desc) x
cross join (SELECT @curRank := 0, @prevParent := null) r
FIDDLE
【讨论】:
:-) 这给出了一个连续的排名。就像我取得的成就一样。这个想法是从每个父子的 1 开始(就像在期望的结果中一样)。我已经更正了 31,32,33 父母错误的问题。 更新了按父母排名的答案。 谢谢,巴里。我可以看到使用基本 sql 是不可能的。【参考方案2】:试试这个:
select child.id,
child.perCent,
CASE parent.id
WHEN @curParent THEN @curRank := @curRank + 1
ELSE @curRank := 1 AND @curParent := parent.id END as Rank
from likesd parent, likesd child, (SELECT @curParent := 0, @curRank := 0) r
where parent.id = child.parent
and parent.type = 3
order by parent.id, child.perCent desc;
【讨论】:
您的 sql 中的 AS 等级有一个错误,从过去 10 分钟开始我无法理解。有什么想法吗? 像我一样工作。但这不是想法。查看所需的结果。需要为每个父母重置排名。这也是我卡住的地方。 效果很好。只是一个小问题,你已经偏离了我原来的 sql。你的 sql 和我的 sql 会输出相同的结果,对吧?不会有问题... 是的,我已经使用了您的查询,只是更改了连接条件以上是关于将递增值合并到此 sql的主要内容,如果未能解决你的问题,请参考以下文章