أضف قيمة ديناميكية إلى 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
كرقم نستخدمه للإشارة إلى عناصر df
و out
, أو الثاني) مع 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)
}
التي تستخدمها تعتمد على الذوق الشخصي. يتطلب منك الإصدار الثاني (2) تعيين أسماء على متجه الإخراج 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())
يجب أن يعمل شيء على هذا المنوال.