【问题标题】:Good implementation [closed]良好的实施[关闭]
【发布时间】:2021-04-16 00:17:34
【问题描述】:

我正在尝试执行以下MySQL 查询

通过这个查询可以获得赛车的分类,以及这些赛车的车手

查询:

SELECT * FROM results 
INNER JOIN cars ON results.idCar = cars.Id
INNER JOIN drivers ON cars.id = drivers.idCar
WHERE idSesson = 7 
ORDER BY classification
ASC

此查询返回 2 个模型:结果、会话。并返回每辆车的司机列表

问题是它返回每个pilot的结果,即相同的结果可以出现3次只有pilot不同,我想在JSONArray内添加pilot

使用了这个查询我使用了这个实现

    result := structs.Result{}
    lastResult := structs.Result{}
    results := []structs.Result{}
    driver := structs.Driver{}
    drivers := []structs.Driver{}
    for rows.Next() {
        var sesson structs.Sesson
        var car structs.Car

        err = rows.Scan(&result.Id, &sesson.Id, &car.Id, &result.Type, &result.Classification, &result.Category, &car.Id, &car.IdTeam, 
            &car.Name, &car.Number, &car.Model, &car.Manufacturer, &car.TyerBrand, &car.CarImage, &driver.Id, &driver.IdCar,
            &driver.Name, &driver.Age, &driver.DateOfBrith, &driver.Country, &driver.FlagCountry, &driver.Facebook, &driver.Twitter, &driver.Website, &driver.Picture)
        if err != nil {
            fmt.Printf("Error in scan")
            panic(err.Error())
        }

        result.Sesson = sesson
        result.Car = car
        drivers = append(drivers, driver) // i stor the drivers in one array

        // check if end the duplicated, info
        if (lastResult.Id != 0 && lastResult.Id != result.Id) {
            results = append(results, lastResult)
        }
        
        // store the last result
        lastResult = result
    }

    // add last result
    results = append(results, lastResult)

    // save the drivers in JSONArray in each jsonObject
    for i := 0; i < len(results); i++ {
        for j := 0; j < len(drivers); j++ {
            if (results[i].Car.Id == drivers[j].IdCarro) {
                results[i].Drivers = append(results[i].Drivers, drivers[j])
            }
        }
    }

    // transform data in json
    jsonData, err := json.Marshal(results)
    if err != nil {
        fmt.Printf("error in marsahl")
    }

    db.Close()

    return jsonData

这是一个好的实现吗?对于这个问题??

我可以在 302ms

内得到结果
[
    {
        "id": 44,
        "sesson": {
            "id": 33,
            "name": "",
            "date": "",
            "startTime": "0001-01-01T00:00:00Z",
            "endTime": "0001-01-01T00:00:00Z",
            "raceId": 0
        },
        "car": {
            "id": 10,
            "idTeam": 6,
            "name": "AF CORSE",
            "number": 54,
            "model": "Ferrari 488 GTE",
            "manufactor": "Ferrari",
            "tyerBrand": "https://storage.googleapis.com/ecm-prod/assets/Tyre/wec-2019-logo-tyres-app_435d35.png",
            "carImage": "https://storage.googleapis.com/ecm-prod/media/cache/entry_car_md/assets/1/engage/45325/lmgte_743f0c.png"
        },
        "type": 7,
        "drivers": [
            {
                "id": 4,
                "idCar": 10,
                "name": "Thomas Flohr",
                "age": 60,
                "dateOfBrith": "1960-03-01",
                "country": "Switzerland",
                "countryFlag": "urlCountryFlag",
                "facebook": "facebook.com",
                "twitter": "twitter.com",
                "website": "website.com",
                "foto": "urlFoto"
            },
            {
                "id": 5,
                "idTeam": 10,
                "name": "Francesco Castellacci",
                "age": 33,
                "dateOfBrith": "1987-04-03",
                "country": "Italy",
                "countryFlag": "urlCountryFlag",
                "facebook": "facebook.com",
                "twitter": "twwitter.com",
                "website": "website.com",
                "foto": "pictureUrl"
            }
        ],
        "classification": 13,
        "category": 3
    }
 ]

这是JSON 中的结果。

解决这个问题有好的办法吗??

【问题讨论】:

  • 我认为一张地图,其键是 [session, car] 并且其值是司机列表会在这里有所帮助
  • 是的,使用 map 会显着降低复杂度从 n^2 到 n
  • 您的查询需要多长时间?如果您共享您的数据库结构,我们可能会看到查询是否未优化

标签: mysql sql arrays json go


【解决方案1】:

你可以做的几件事

  1. 修复结果变量的范围,将其移动到循环中,它不会在其他任何地方使用
  2. 不是创建会话和汽车变量,而是直接扫描到结果变量中
  3. 使用地图移除嵌套的 for 循环将节省您获得线性复杂性的时间

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多