我有一个像这样的位置表结构
| id|姓名|活跃|1级|2级|三级|4级|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|
| 一个|一个|真的|一个|零|零|零|
| 2| A>B|真的|一个|B|零|零|
| 3| A>B>C|真的|一个|B| C类|零|
| 4| A>B>C>D|真的|一个|B| C类|D|
如果给定位置id = 3,则查询应返回id=(1,2,3)但为4的记录
如果给定位置id = 2,则查询应返回id=(1,2)但为2和4的记录
如果给定位置id = 4,则查询应返回id= 1、2、3和4的所有记录
感谢任何帮助;)
3条答案
按热度按时间xiozqbni1#
您可以比较名称:
或:
或:
或者你可以比较一下水平:
其中,对于样本数据:
所有输出:
| ID|名称|激活|1级|2级|3级|4级|
| - -----|- -----|- -----|- -----|- -----|- -----|- -----|
| 一个|一个|真的|一个|联系我们|联系我们|联系我们|
| 2| A>B|真的|一个|B|联系我们|联系我们|
| 3| A>B>C|真的|一个|B| C类|联系我们|
fiddle
ttisahbt2#
**编辑:**愚蠢的我...看到另一个答案,我意识到
CONCAT
enating所有这些COALESCE
s结果都会导致name
,导致:当然,只需要一个
OR
。我的方法:
交替地
两者都工作正常(demo/demo),目前最好的,出现在我的脑海。
必须承认,这两种方法都需要在查询中插入id两次,这可以通过join来避免,但代价可能会更高。
如果其中任何一个在你的数据库上不起作用(只用PostgreSQL测试),不管出于什么原因,我以前的尝试是:
Works,但需要计算更多的字符串和更多的比较,因此效率较低。
对于
WITH
可能不受支持的情况,我也设法这样做了:这是我最初的尝试--尽管有了所有这些子查询,它肯定不会太有效了……
n1bvdmb63#
假设
Name
中的最后一个字符表示当前级别,最后一个字符之前的字符表示父级别,您可以使用递归查询的典型方法来解决这个问题。demo