Использовать подзапрос в Select

Есть ли способ использовать функцию SubQuery в Select?? Я видел это как часть предложения Where, но мне нужно выбрать.

Я решаю это временно, делая это:

func GetUserProviders(userID int) ([]userprovider, error) {
    providers := []userprovider{}
    query := `SELECT (count(users_providers.user_id) > 0) 
                FROM users_providers 
                WHERE users_providers.user_id = '` + strconv.Itoa(userID) + `' AND users_providers.provider_id=providers.id`
    rows, err := db.DB.Table("providers").
        Select("providers.id, providers.name, (" + query + ") as checked").Rows()

    if err == nil {
        for rows.Next() {
            var provider = userprovider{}
            db.DB.ScanRows(rows, &provider)
            providers = append(providers, provider)
        }
    }
    return providers, err
}

Но я бы предпочел, если это возможно, использовать функцию ORM вместо объединения строк.

В этом случае опасности нет, но для других случаев было бы здорово, если бы была какая-то функция преобразования

// SQL expression
type expr struct {
    expr string
    args []interface{}
}

в очищенную строку.

Заранее спасибо.


person Eloy Fernández Franco    schedule 24.08.2018    source источник


Ответы (1)


Хорошо... Я нашел решение:

q := db.DB.Table("users_providers").
    Select("(count(users_providers.user_id) > 0)").
    Where("users_providers.user_id = ? AND users_providers.provider_id=providers.id", userID).
    SubQuery()
rows, err := db.DB.Table("providers").
    Select("providers.id, providers.name, ? as checked", q).
    Rows()

Функция Select принимает 2 аргумента: один для запроса, а другой для аргументов, работая так же, как и функция Where.

Спасибо, в любом случае :)

person Eloy Fernández Franco    schedule 24.08.2018