首页 > 解决方案 > 如何在 RMySQL 上做累计和?在 phpMyAdmin 中工作,但在 R 中给出错误

问题描述

我需要通过添加 2 列中的值来找到累积频率,这就是我在 phpMyAdmin 上尝试的方式。但是当我尝试使用 R 语言时,它给了我一个错误。

SELECT time.month, 
       hotel.state, 
       hotel.name, 
       income                                        AS 'Checkout Income', 
       booking.expected_income                       AS 'Future Income', 
       ( @sumvariable := @sumvariable + income 
                         + booking.expected_income ) AS 'Cumulative Income' 
FROM   checkout 
       INNER JOIN booking 
               ON checkout.checkout_id = booking.bookings_id 
       INNER JOIN time 
               ON checkout.timeid = time.timeid 
       INNER JOIN hotel 
               ON checkout.hotelid = hotel.hotelid 
WHERE  hotel.category = '4-star' 

这是我使用 RMySQL 从 R 得到的错误:

.local(conn, statement, ...) 中的错误:无法运行语句:您的 SQL 语法有错误;查看与您的 MariaDB 服务器版本相对应的手册,了解在第 2 行的 'SELECT time.month, hotel.state,income, booking.expected_In' 附近使用的正确语法

这就是我在 phpMyAdmin 中得到的结果

请帮帮我。

标签: mysqlsqlr

解决方案


SET ...; SELECT ...;在 RMySQL 中,与 R DBI 系列中的大多数 API(ROracle、RPostgreSQL、RSQLite、odbc 等)一样,仅执行第一个语句的情况下,不支持多个 DDL/DML 语句,例如在同一个调用中。您可以拥有多个SELECT,然后使用dbNextResult. 在 PHPMyAdmin(一个 IDE)中,可以在查询窗口中运行多行甚至完整的 SQL 脚本。

因此,您将需要进行多次查询调用,一次用于初始化参数,然后一次用于运行查询:

dbSendQuery(con, 'SET @SumVariable := 0;')             # PARAM SAVED IN SESSION
df <- dbGetQuery(con, 'SELECT ...original query...')

相关子查询

话虽如此,考虑一个使用相关聚合子查询的语句,由于多个JOIN. 一旦 MySQL 在未来版本中支持 CTE,这可以显着减少。timeid下面使用假定为唯一和升序的字段进行关联(WHERE根据需要在子句中调整)。

SELECT time.month, 
       hotel.state, 
       hotel.name, 
       income                                        AS 'Checkout Income', 
       booking.expected_income                       AS 'Future Income', 

       (SELECT SUM(income + sub_b.expected_income)            
        FROM   checkout sub_c
               INNER JOIN booking sub_b
                       ON sub_c.checkout_id = sub_b.bookings_id 
               INNER JOIN time sub_t
                       ON sub_c.timeid = sub_t.timeid 
               INNER JOIN hotel sub_h
                       ON sub_c.hotelid = sub_h.hotelid 
        WHERE  sub_h.category = '4-star' 
          AND  sub_t.time_id <= time.time_id)        AS 'Cumulative Income' 

FROM   checkout 
       INNER JOIN booking 
               ON checkout.checkout_id = booking.bookings_id 
       INNER JOIN time 
               ON checkout.timeid = time.timeid 
       INNER JOIN hotel 
               ON checkout.hotelid = hotel.hotelid 
WHERE  hotel.category = '4-star' 
ORDER BY time.time_id;

存储过程

或者,将多行保存在存储过程中并从 R 调用它。事实上,关于将 SQL 保存在应用程序代码(即 R)中或作为存储的效率、可维护性和可用性方面的优缺点一直存在争论。程序。

  • MySQL (运行一次)

    DELIMITER //
    
    CREATE PROCEDURE my_stored_proc
    BEGIN
       SET ...;
       SELECT ...;
    END //
    
    DELIMITER ;
    
  • R

    conn <- dbConnect(RMySQL::MySQL(), dbname="databasename", host="hostname",
                      username="username", password="password")
    df <- dbGetQuery(conn, "CALL my_stored_proc()")
    dbDisconnect(conn)
    

推荐阅读