Добавьте динамическое значение в RMYSQL GetQuery [дублировать
Вопрос
Этот вопрос уже имеет ответ здесь:
- Динамическая «строка» в R 2 ответа
Можно ли пройти значение в запрос в dbGetQuery
из пакета Rmysql.
Например, если у меня есть набор значений в векторном вектор:
df <- c('a','b','c')
И я хочу зацикливаться через значения, чтобы вытащить определенное значение из базы данных для каждого.
library(RMySQL)
res <- dbGetQuery(con, "SELECT max(ID) FROM table WHERE columna='df[2]'")
Когда я пытаюсь добавить ссылку на значение, я получаю ошибку. Удивительно, что можно добавить значение из объекта R в запросе.
Решение
Один вариант - манипулировать строкой SQL в цикле. На данный момент у вас есть строковая буквальная, 'df[2]'
не интерпретируется r как все, кроме персонажей. В моем ответе будет некоторые неоднозначные возможности, потому что df
В вашем Q - это нечестно не кадр данных (это символ вектор!). Что-то вроде этого сделает то, что вы хотите.
Храните вывод в числовом векторе:
require(RMySQL)
df <- c('a','b','c')
out <- numeric(length(df))
names(out) <- df
Теперь мы можем закрутить элементы df
Для выполнения вашего запроса три раза. Мы можем установить цикл два способа: I) с i
как число, которое мы используем для ссылки на элементы df
и out
, или II) с i
как каждый элемент df
в свою очередь (т.е. a
, потом b
, ...). Я покажу обе версии ниже.
## Version i
for(i in seq_along(df)) {
SQL <- paste("SELECT max(ID) FROM table WHERE columna='", df[i], "';", sep = "")
out[i] <- dbGetQuery(con, SQL)
dbDisconnect(con)
}
ИЛИ:
## Version ii
for(i in df) {
SQL <- paste("SELECT max(ID) FROM table WHERE columna='", i, "';", sep = "")
out[i] <- dbGetQuery(con, SQL)
dbDisconnect(con)
}
Который вы используете, будут зависеть от личного вкуса. Вторая (ii) версия требует, чтобы вы установили имена на выходе вектор out
которые такие же, как данные внутри out
.
Сказав все это, предполагая, что ваш фактический запрос SQL аналогичен тому, которое вы публикуете, не можете сделать это в одном операторе SQL, используя GROUP BY
пункт, чтобы сгруппировать данные перед вычислением max(ID)
? Делать простые вещи в базе данных, как такова, скорее всего, будет намного быстрее. К сожалению, у меня нет экземпляра MySQL, чтобы играть, и мой SQL-FU слабым в настоящее время, поэтому я не могу привести пример этого.
Другие советы
Вы также можете использовать sprintf
Команда для решения проблемы (это то, что я использую при создании блестящих приложений).
df <- c('a','b','c')
res <- dbGetQuery(con, sprintf("SELECT max(ID) FROM table WHERE columna='%s'"),df())
Что-то вдоль этих строк должно работать.