RMySQL - 从db中选择数据,其中value存在于列表中

问题描述 投票:1回答:1

我试图从数据库中提取数据,只有名称存在于已存在的数据框中。我不确定如何将列表包含在我的选择陈述中。

奖励:我需要将所有数据重新格式化为更友好的格式。

library(RMySQL)
library(DBI)

db_con <- dbconnect(RMySQL::MySQL(),
          username: "user",
          password: "1234",
          dbname = "test")

df <- as.data.frame(tbl(db_con, sql("SELECT name, loc, type, value FROM data"))

这读取整个数据表。我需要根据名称字段限制进来的内容。

 df$names <- "cat, hamster"

 name_filter <- df$names

目前的df:

#    name    loc     type    val
1    cat     ab12    a       1
2    cat     1233    a       0
3    dog     ab12    a       0
4    dog     45ff    b       1
5    hamster ab12    a       1
6    hamster 45ff    b       0

期望的输出没有读取整个表:SELECT * WHERE name IN name_filter?

#    loc    type    cat    hamster
1    ab12   a       1      1
2    1233   a       0      0
3    45ff   b       0      0

编辑:尝试使用库(重塑)数据不是很好。我可能做错了虽然...我现在正在拉动一个截断的数据库,大约有4500万行。 (完整的数据库大约有3亿。)

 cast(df, loc+type ~ name, value = "val")

这导致一个非常长的暂停,接着是“聚合需要fun.aggregate:长度用作默认值”错误,然后是似乎是一个无休止的停顿。

EDIT2:名单长度是几百个项目,每次请求时都不同。每个名称有数万个值。

EDIT3:我在另一个线程中发现了这个问题,试图根据值列表生成一个select语句。我不确定它是否有用,因为我无法让它工作。

list <- list$Name
sel <- "SELECT name, loc, type, val FROM data WHERE name IN (%s)"
sql1 <- sprintf(sel,paste(list, collapse =","))

yields: 
"SELECT name, loc, type, val FROM data WHERE name IN (dog,cat,hamster,square,triangle,circle,ball,horse,lion)

EDIT4:尝试使用以下内容,但收到有关MariaDB语法的错误。 MySQL和MariaDB之间的select语句有区别吗?

list <- df$Name
sqlqry <- "SELECT data.loc, data.type"
for (i in 1:length(list)) {
  sqlqry <- paste0(sqlqry, sprintf(", MAX(CASE WHEN data.name = '%s' 
                           THEN 1 ELSE 0 END) AS %s",list[i], list[i]))
}
sqlqry <- paste0(sqlqry, "FROM 
data
GROUP BY 
data.loc
, data.type")

test <- dbSendQuery(db_con, sqlqry)
mysql r rmysql
1个回答
0
投票

此查询将为您提供所需的结果。

SELECT 
   data.loc
 , data.type
 , MAX(CASE WHEN data.name = 'cat' THEN 1 ELSE 0 END) AS cat
 , MAX(CASE WHEN data.name = 'hamster' THEN 1 ELSE 0 END) AS hamster
FROM 
 data
GROUP BY 
   data.loc
 , data.type

为了避免扫描整个表,您将需要(覆盖)索引。 该索引应该通过上述查询更快地选择。

ALTER TABLE data ADD INDEX <index_name> (loc, type, name)
, ALGORITHM=INPLACE
, LOCK=NONE

, ALGORITHM=INPLACE, LOCK=NONE只适用于InnoDB引擎。它是InnoDB's online DLL的一部分,可以使桌子没有停机时间。

© www.soinside.com 2019 - 2024. All rights reserved.