如何正确分组数据以获得树状结构?

在 golang 应用程序中,我对这样的表进行查询:


| ID        | AGG_YEAR | AGG_MONTH | GENDER | AGE_RANGE | INCOME_RANGE | TOTAL |

|-----------|----------|-----------|--------|-----------|--------------|-------|

| 107502389 | 2019     | 7         | F      | 18_29     | 1000_2000    | 15    |

| 107502389 | 2019     | 7         | F      | 18_29     | 2000_4000    | 42    |

| 107502389 | 2019     | 7         | F      | 30_44     | 1000_2000    | 25    |

| 107502389 | 2019     | 7         | F      | 30_44     | 2000_4000    | 63    |

| 107502389 | 2019     | 7         | M      | 18_29     | 1000_2000    | 30    |

| 107502389 | 2019     | 7         | M      | 18_29     | 2000_4000    | 18    |

| 107502389 | 2019     | 7         | M      | 30_44     | 1000_2000    | 36    |

| 107502389 | 2019     | 7         | M      | 30_44     | 2000_4000    | 19    |

此表存储有关某个月内具有某个工资水平的男性和女性的总数的信息。通常,在对数据库进行一次查询之后,每条记录都会被一一解析:


type Entry struct {

    ID int `json:"id"`

    AggYear int `json:"agg_year"`

    AggMonth int `json:"agg_month"`

    Gender string `json:"gender"`

    AgeRange string `json:"age_range"`

    IncomeRange string `json:"income_range"`

    Total int `json:"total"`

}


var entries []Entry


rows, err := database.Query("***"); if err != nil {

    fmt.Println(err)

    return

}


defer rows.Close()


for rows.Next() {

    var entry Entry


    if err = rows.Scan(&entry.ID, &entry.AggMethod, &entry.AggYear, &entry.AggMonth, &entry.Gender, &entry.AgeRange, &entry.IncomeRange, &entry.Total); err != nil {

        fmt.Println(err)

        return

    }


    entries = append(entries, entry)

}


type IncomeDetails struct {

    IncomeRange string `json:"income_range"`

    Total int `json:"total"`

}


type AgeDetails struct {

    AgeRange string `json:"age_range"`

    Details []IncomeDetails `json:"details"`

}


我想知道将以下值分组的最佳方法,如下例所示?我想了解动作的顺序。我将不胜感激任何帮助。


侃侃无极
浏览 127回答 1
1回答

潇湘沐

通常,我会根据我想要的响应来更新结构。例如,在您的情况下,它将是:type DataEntry struct {    ID int `json:"id"`    Details []EntryDetails `json:"details"`}type EntryDetails struct {     AggYear int `json:"agg_year"`    AggMonth int `json:"agg_month"`    Details []GenderDetails `json:"details"`}type GenderDetails struct {    Gender string `json:"gender"`    Details []AgeDetails `json:"details"`} type AgeDetails struct {    AgeRange string `json:"age_range"`    Details []IncomeDetails `json:"details"`}type IncomeDetails struct {     IncomeRange string `json:"income_range"`    Total int `json:"total"`}将代码分成更小的部分总是更容易阅读和维护。下一部分将详细信息添加到结构中:您应该根据要求查询您的代码以逐个填充结构。例如:先getID-'Entry struct',然后getAggYear & getAggMonth为ID-'EntryDetails struct'等等。你可以在这里找到完整的工作程序:https: //play.golang.org/p/_pdb5y9Wd-O
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go