Как указать переменные соединения с разными именами в разных таблицах MySQL

Мне нужно объединить две таблицы, в которых общий идентификатор столбца, который я хочу использовать, имеет другое имя в каждой таблице. Две таблицы имеют "ложное" общее имя столбца, которое не работает, когда dplyr принимает значение по умолчанию и объединяет столбцы "id".

Вот часть кода, связанного с этой проблемой

library(dplyr)
library(RMySQL)

SDB <- src_mysql(host = "localhost", user = "foo", dbname = "bar", password = getPassword())
# Then reference a tbl within that src
administrators <- tbl(SDB, "administrators")
members <- tbl(SDB, "members")

Вот 3 попытки — все они не увенчались успехом — передать информацию о том, что общий столбец на стороне участников — «id», а на стороне администраторов — «idmember»:

sqlq  <- semi_join(members,administrators, by=c("id","idmember"))
sqlq  <- inner_join(members,administrators, by= "id.x = idmember.y")
sqlq  <- semi_join(members,administrators, by.x = id, by.y = idmember)

Вот пример сообщений об ошибках, которые я получаю:

Ошибка в mysqlExecStatement (соединение, оператор, ...): драйвер RS-DBI: (не удалось запустить оператор: неизвестный столбец «_LEFT.idmember» в «предложении where»)

Примеры, которые я вижу, относятся к таблицам данных и фреймам данных на стороне R. Мой вопрос о том, как dplyr отправляет операторы «by» в механизм SQL.


person John David Smith    schedule 30.07.2014    source источник
comment
Возможный дубликат stackoverflow.com/questions/21888910/ См. также github.com/hadley/dplyr/issues/177   -  person talat    schedule 31.07.2014


Ответы (2)


В следующей версии dplyr вы сможете:

inner_join(members, administrators, by = c("id" = "idmember"))
person hadley    schedule 30.07.2014

Похоже, это нерешенная проблема: https://github.com/hadley/dplyr/issues/177

Однако вы можете использовать слияние:

❥ admin <- as.tbl(data.frame(id = c("1","2","3"),false = c(TRUE,FALSE,FALSE)))
❥ members <- as.tbl(data.frame(idmember = c("1","2","4"),false = c(TRUE,TRUE,FALSE)))
❥ merge(admin,members, by.x = "id", by.y = "idmember")
  id false.x false.y
1  1    TRUE    TRUE
2  2   FALSE    TRUE

Если вам нужно выполнить левое или внешнее соединение, вы всегда можете использовать аргументы ALL.x или ALL для слияния. Однако мысль... У вас есть база данных sql, почему бы ее не использовать?

❥ con2 <- dbConnect(MySQL(), host = "localhost", user = "foo", dbname = "bar", password = getPassword())    
❥ dbGetQuery(con, "select * from admin join members on id = idmember")
person jed    schedule 30.07.2014
comment
такое объединение на стороне SQL работает, но я надеялся получить свой пирог и съесть его тоже: пусть сторона SQL выполняет объединение, но запускает его со стороны dplyr (для ясности, простоты и т. д.) Спасибо! - person John David Smith; 31.07.2014