【发布时间】: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
-
您的查询需要多长时间?如果您共享您的数据库结构,我们可能会看到查询是否未优化