递归查询mysql

时间:2018-01-30 14:46:37

标签: mysql hierarchy recursive-query

我无法使用使用此语句的查询获取递归数据:

#generate data for df1 a1 <- rnorm(100, 3, 1.2) b1 <- rnorm(100, 2, 0.5) c1 <- rnorm(100, 4, 1.5) d1 <- rnorm(100, 5, 0.2) e1 <- rnorm(100, 6, 0.7) df_1 <- data.frame(a1, b1, c1, d1, e1) #generate data for df2 a2 <- rnorm(50, 3, 1.2) b2 <- rnorm(50, 2, 0.5) c2 <- rnorm(50, 4, 1.5) d2 <- rnorm(50, 5, 0.2) e2 <- rnorm(50, 6, 0.7) df_2 <- data.frame(a2, b2, c2, d2, e2) #rename columns df_1 <- dplyr::rename(df_1, a = a1, b = b1, c = c1, d = d1, e = e1) df_2 <- dplyr::rename(df_2, a = a2, b = b2, c = c2, d = d2, e = e2) #create variable name vector to iterate through vars <- c('a', 'b', 'c', 'd', 'e') #loop to generate ggplots for (var in vars){ plot_name <- ggplot(df_1, aes(var, color = "df 1")) + geom_density() + geom_density(var, color="df 2"), data = df_2) ggsave(paste0(var, ".pdf"), plot = plot_name, width = 8, height = 5, units = "in", dpi = 300) }

我试图获取与桌子相关的行:

WITH RECURSIVE

我需要获取这些数据:zone_05在哪里?

id |      name     |extern|
--------------------------|
1  |  building_01  |  null
--------------------------|
2  |    floor_01   |  1
--------------------------|
3  |    zone_04    |  2
--------------------------|
4  |    zone_05    |  3

我试图用这句话解决它,但我只得到第一个相关的行:

4 | zone_05    | 3
---------------|
3 | zone_04    | 2
---------------|
2 | floor_01   | 1
---------------|
1 | building_01| null
---------------|

结果:

select  id,
    name,
    extern
    from    (select * from table) products_sorted,
    (select @pv := '4') initialisation
    where   find_in_set(id, @pv) > 0
    and     @pv := concat(@pv, ',', extern)

此解决方案对我不起作用:

How to create a MySQL hierarchical recursive query

@trincot是否有可能改变这种状态以便在&#34;反向&#34;?所以抓住所有的父母,祖父母等等?我已经使用你的第一个查询来获得后代,但我想得到祖先?同样。 - shreddish Jul 19&17; 17 at 14:54

如果其他人正在寻找@shreddish问题的答案,解决办法是将p.parent_id = cte.id更改为p.id = cte.parent_id - 在12月10日和17日5:38

解决方案与:

有关

备选方案1:WITH RECURSIVE,CONNECT BY

我无法使用它,因为mysql数据库服务器版本。

1 个答案:

答案 0 :(得分:0)

这是您需要的查询;

select  id,
        name,
        extern_id 
from    (select * from places
         order by id desc, extern_id desc) places_sorted,
        (select @pv := '26') initialisation
where   find_in_set(id, @pv) > 0
and     @pv := concat(@pv, ',', extern_id)

这是小提琴: http://sqlfiddle.com/#!9/ba5700/2

正如您所看到的,“顺序”非常重要,正如您提到的答案中的trincot所解释的那样