Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL查询作为瞬态RoR(ActiveRecord)模型_Mysql_Sql_Ruby On Rails_Activerecord_View - Fatal编程技术网

Mysql SQL查询作为瞬态RoR(ActiveRecord)模型

Mysql SQL查询作为瞬态RoR(ActiveRecord)模型,mysql,sql,ruby-on-rails,activerecord,view,Mysql,Sql,Ruby On Rails,Activerecord,View,遗憾的是,我找不到很多关于我正在尝试做什么的信息。我会尽量简短地把它分解一下 我正在处理一个遗留数据库,相信我,这也让我很沮丧,但事实就是如此,所以我们必须在这个参数范围内工作 我有一个数十万行的数据库,还有一个需要生成的特别糟糕的统计/报告。最初它是在一个大的查询中,但这使得使用它非常令人沮丧,因为它不允许非常枯燥的架构。我将查询分解为几个视图,并最终将它们合并到一个最终视图中,该视图对测试/开发非常有效,但我相信一些阅读本文的资深/有经验的人可能已经猜到了,它相当缓慢。最明显的加速方法是将w

遗憾的是,我找不到很多关于我正在尝试做什么的信息。我会尽量简短地把它分解一下

我正在处理一个遗留数据库,相信我,这也让我很沮丧,但事实就是如此,所以我们必须在这个参数范围内工作

我有一个数十万行的数据库,还有一个需要生成的特别糟糕的统计/报告。最初它是在一个大的查询中,但这使得使用它非常令人沮丧,因为它不允许非常枯燥的架构。我将查询分解为几个视图,并最终将它们合并到一个最终视图中,该视图对测试/开发非常有效,但我相信一些阅读本文的资深/有经验的人可能已经猜到了,它相当缓慢。最明显的加速方法是将where子句应用于连接在一起的内部视图。这使整个过程加快了一个大的数量级

所以,考虑到这一点,我想

为什么我不能创建一个模型并定义它应该使用的大型联合/选择感染SQL,并将模型上的任何where子句应用于每个子选择

我的想法是,这将基本上创建一个虚拟模型,我找不到任何这个名称的东西,所以我在这里抓住的是在任何地方都不存在的虚拟模型,但当被查询时,它将返回与其他更持久的模型最有可能有关系的瞬态对象

为了说明这一点,我将发布一个大的令人讨厌的sql。从这个角度来看,它本质上是总结/计算会员销售的统计数据等

SELECT
    `traffic`.`date` AS `date`,
    `traffic`.`site_id` AS `site_id`,
    `traffic`.`partner_id` AS `partner_id`,
    `traffic`.`visits` AS `visits`,
    `traffic`.`clicks` AS `clicks`,
    `traffic`.`signups` AS `signups`,
    `payout`.`signup_total` AS `signup_total`,
    `payout`.`upgrade_total` AS `upgrade_total`,
    `payout`.`recurring_total` AS `recurring_total`,
    `payout`.`referring_total` AS `referring_total`,
    `payout`.`negative_total` AS `negative_total`,
    `payout`.`fee_total` AS `fee_total`,
    `payout`.`carryover_total` AS `carryover_total`,
    `payout`.`adjustment_total` AS `adjustment_total`,
    `payout`.`payment_total` AS `payment_total`,
    `payout`.`payment_nums` AS `payment_nums`
    FROM (
        ((SELECT CAST(`traffic_date` AS DATE) AS `date`,
            `site_id`,
            `partner_id`,
            Sum(IF(tracking_type = 1, count, 0)) AS `visits`,
            Sum(IF(tracking_type = 6, count, 0)) AS clicks,
            Sum(0)                               AS signups
            FROM `tracking`.`tracking_partner_ad_event`
            WHERE `partner_id` = 1796279
            GROUP BY 1, 2, 3)
        UNION
        (SELECT CAST(`traffic_date` AS DATE) AS `date`,
            `site_id`,
            `partner_id`,
            Sum(count) AS visits,
            Sum(0)     AS clicks,
            Sum(0)     AS signups
            FROM `tracking`.`tracking_partner_traffic_visit`
            WHERE `partner_id` = 1796279
            GROUP BY 1, 2, 3)
        UNION
        (SELECT CAST(`processed_date` AS DATE) as `date`,
            `site_id`,
            `partner_id`,
            Sum(0) AS visits,
            Sum(0) AS clicks,
            Sum(1) AS signups
            FROM `user_account_entry`
            WHERE `trans_type` = 2 AND `status` <> 2 AND `partner_id` = 1796279
            GROUP BY 1, 2, 3)
        ) AS `traffic`
    JOIN
        (SELECT
            `period` AS `period_id`,
            `partner_id`,
            `processed_date`,
            `site_id`,
            SUM(IF(`payout_type`=1, amount, 0)) AS `signup_total`,
            SUM(IF(`payout_type`=2, amount, 0)) AS `upgrade_total`,
            SUM(IF(`payout_type`=3, amount, 0)) AS `recurring_total`,
            SUM(IF(`payout_type`=8, amount, 0)) AS `referring_total`,
            SUM(IF(`payout_type`=4, amount, 0)) AS `negative_total`,
            SUM(IF(`payout_type`=7, amount, 0)) AS `fee_total`,
            SUM(IF(`payout_type`=9, amount, 0)) AS `carryover_total`,
            SUM(IF(`payout_type`=5, amount, 0)) AS `adjustment_total`,
            SUM(IF(`payout_type`=6, amount, 0)) AS `payment_total`,
            GROUP_CONCAT(`payment_num` ORDER BY 1) AS `payment_nums`
        FROM `partner_account_entry` AS `e`
        WHERE `partner_id` = 1796279
        GROUP BY 1,2 ORDER BY 1,2
        ) AS `payout` ON (
        (
            (`traffic`.`date` = `payout`.`processed_date`) AND
            (`traffic`.`site_id` = `payout`.`site_id`) AND
            (`traffic`.`partner_id` = `payout`.`partner_id`)
        )
    )
) GROUP BY 1,2,3 ORDER BY 1
如您所见,通过在partner_id上选择,此查询得到了显著优化

TL;DR:我希望将上面的SQL封装在一个模型中,即使任何查询都要求提供partner_id,以模拟可以传递并进一步链接的rails AR对象

这是不合理的要求吗?巨大的努力?这怎么可能呢?我找不到现有的例子,这让我担心,但也让我困惑;这不是一个合理的策略吗?为什么不存在解决方案