将动态值添加到RMySQL getQuery中

将动态值添加到RMySQL getQuery中,r,rmysql,R,Rmysql,是否可以从RMySQL包将值传递到dbGetQuery中的查询中 例如,如果在字符向量中有一组值: df <- c('a','b','c') 我想循环遍历这些值,从数据库中为每个值提取一个特定的值 library(RMySQL) res <- dbGetQuery(con, "SELECT max(ID) FROM table WHERE columna='df[2]'") 当我尝试将引用添加到值时,我得到一个错误。想知道是否可以在查询中添加R对象的值。一个选项是在循环中

是否可以从RMySQL包将值传递到dbGetQuery中的查询中

例如,如果在字符向量中有一组值:

df <- c('a','b','c')
我想循环遍历这些值,从数据库中为每个值提取一个特定的值

library(RMySQL)    
res <- dbGetQuery(con, "SELECT max(ID) FROM table WHERE columna='df[2]'")

当我尝试将引用添加到值时,我得到一个错误。想知道是否可以在查询中添加R对象的值。

一个选项是在循环中操作SQL字符串。当您有一个字符串文字时,“df[2]”不会被R解释为字符以外的任何字符。在我的回答中会有一些含糊不清的地方,因为Q中的df显然不是一个数据帧,而是一个字符向量!。像这样的东西可以满足你的需要

将输出存储在数字向量中:

require(RMySQL)
df <- c('a','b','c')
out <- numeric(length(df))
names(out) <- df
或:

你使用哪一种取决于个人品味。第二个ii版本要求您在输出向量out上设置与内部数据相同的名称

话虽如此,假设您的实际SQL查询与您发布的SQL查询相似,您不能在一条SQL语句中使用GROUP BY子句在计算maxID之前对数据进行分组吗?在数据库中做这样简单的事情可能会快得多。不幸的是,我没有一个MySQL实例可供使用,而且我的SQL fu目前很弱,所以我不能给出一个这样的例子。

你也可以使用sprintf命令来解决这个问题,这是我在构建闪亮的应用程序时使用的


df@Gavin,恕我直言,我认为您在最后一段中提到的查询应该是:从表中选择maxID,columna,其中columna在'a'、'b'、'c'中逐列列出,当然是为了确保您的变量中没有任何东西会破坏SQL语法。强制性XKCD参考:@Spacedman,小Bobby表。。。经典感谢您在您的帖子中提供的详细信息。这是非常有帮助的,再一次,我从中学到了很多。关于在我的SQL语句中需要GROUP BY子句的问题,因为此ID是一个数字自动递增器和主键,所以该列中只能有不同的值,所以我不需要GROUP BY。@analyticsPierce:我认为您没有理解GROUP BY的要点。我的想法是,Joshua Ulrich在SQL中为我们提供了一个数据帧,可以从一条SQL语句返回一个数据帧,其中一列中有3个maxID值,第二列中有a、b、c列。因此,无需在循环中执行三条SQL语句。执行one语句,让DB完成这项工作,然后从R端提取您想要的值。这大大减少了工作量、打字和计算时间。约书亚的副本,谢谢你指出这一点。这也是一个很好的答案。我一直在搜索RMySQL解决方案。无论您使用的是RMySQL还是RSQLlite,解决方案都是相同的。
## 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)
}