作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试重建具有树结构的数据。
示例 - 国家/城市:
1) USA
1.1) New York
1.2) Chicago
2) France
2.1) Paris
2.2) Lyon
3) China
在我的数据库中,它看起来像这样:
| Element | Level | Row |
|:--------:|:-----:|:---:|
| USA | 1 | 1 |
| New York | 2 | 2 |
| Chicago | 2 | 3 |
| France | 1 | 4 |
| Paris | 2 | 5 |
| Lyon | 2 | 6 |
| China | 1 | 7 |
根据我的条目的顺序(行),我可以重建树结构。对于每一行,我都会查找最近的具有 Level-1 的前一行。
max(pre.Row)/pre.Row < cur.Row/pre.Level = cur.Level-1
以下代码正在运行,并且返回正确的结果。我的问题是该表有 700 万行,因此需要很长时间。这就像比较 700 万乘以 700 万行......
SELECT cur.`Row`, (
SELECT max(pre.`Row`)
FROM `abc`.`def` AS pre
WHERE pre.`Row` < cur.`Row`
AND pre.`Level`=cur.`Level`-1
) AS prev_row
FROM `abc`.`def` AS cur
;
有没有更快的方法来实现这个?
也许有循环或用户变量?我可以想象您实际上从当前行开始,然后测试前一行是否满足条件,否则查找下一行,依此类推。这将减少操作次数至 700 万次~5。我从来没有使用过循环,所以我不知道这在 SQL 中是否可行。有什么想法吗?
最佳答案
这是我对 3 个级别的尝试,如果您有更多级别,您可以添加级别,不知道为什么它会返回看起来像编码值的奇怪值,但 CAST() AS unSIGNED 会像您的查询一样获取 prev_row 。
SELECT Row,
CAST(ELT(level-1,@level_1,@level_2,@level_3) as UNSIGNED) as prev_row,
@level_1 := IF(`level` = 1, row, @level_1),
@level_2 := IF(`level` = 2, row, @level_2),
@level_3 := IF(`level` = 3, row, @level_3)
FROM `def`
ORDER BY Row ASC
关于MySQL - 从前一行获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37869845/
我是一名优秀的程序员,十分优秀!