一种选择是在循环中操作 SQL 字符串。目前你有一个字符串文字,'df[2]' 不会被 R 解释为字符以外的任何东西。我的回答会有一些歧义,因为你的 Q 中的df 显然不是数据框(它是一个字符向量!)。这样的事情会做你想做的。
将输出存储在数值向量中:
require(RMySQL)
df <- c('a','b','c')
out <- numeric(length(df))
names(out) <- df
现在我们可以遍历df 的元素来执行您的查询3 次。我们可以通过两种方式设置循环: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 目前很弱,所以我不能给出这个例子。