在GORM纬度/经度中以Scan acos cos radians进行预加载

时间:2019-07-16 03:35:31

标签: go-gorm

我必须要求得到我周围的商店。我知道如何在MySQL中发出请求,但我不知道如何使用GORM进行请求,以便充分利用语法。

这是MySQL中的查询

SELECT 
id, 
(
   6371 *
   acos(cos(radians(37)) * 
   cos(radians(lat)) * 
   cos(radians(lng) - 
   radians(-122)) + 
   sin(radians(37)) * 
   sin(radians(lat )))
) AS distance 
FROM shops 
HAVING distance < 25 
ORDER BY distance LIMIT 0, 20;

这是我在GORM中的查询

type req struct {
    ID       string `json:"id"`
    Distance string `json:"distance"`
}
re := []res{}
sql := fmt.Sprintf("SELECT id, (6371 * acos(cos(radians(%v)) * cos(radians(lat)) * cos(radians(lng) - radians(%v)) + sin(radians(%v)) * sin(radians(lat)))) AS distance FROM shops WHERE active=1 HAVING distance < %v ORDER BY distance LIMIT 0, 20;", lat, lng, lat, dst)
db.Raw(sql).Rows()
defer rows.Close()
for rows.Next() {
    r := res{}
    rows.Scan(&r.ID)
    re = append(re, r)
}

可以,我有商店清单,但是我必须在同一通话中添加类别(Preload("Categories") 许多商店)。

我知道如何通过两次呼叫做到这一点,一旦我将商店的ID设置在所需的距离内,我就会查找带有类别的IDS商店,但是我想这样做是为了在同一查询中的效果。

0 个答案:

没有答案