MySQL - 将VIEW加入ITSELF

时间:2012-06-19 20:08:20

标签: mysql join views self-join

我正在使用MySQL 5.0。

我想基于视图中的前一行执行计算。这可能吗?我假设不是因为在查询实际运行之前视图不存在,所以有没有解决方法,或者创建和更新表我最好的选择?

这是我错误的编码缺乏逻辑,我知道,但它显示了我想要的成就:

CREATE VIEW `Master Facebook Data` tt1 AS SELECT
    t1.id AS `Client ID`, 
    t1.name AS `Client Name`,
    t1.`Date`,
    avg(t1.`Daily People Talking About This`) AS `Avg Daily Talk`,
    (((tt1.`Avg Daily Talk`-IFNULL(tt2.`Avg Daily Talk`, 0)))/tt1.`Avg Daily Talk`) AS `Change in Talk`,
    avg(t1.`Weekly Total Reach`) AS `Avg Weekly Reach`,
    (((tt1.`Avg Weekly Reach`-IFNULL(tt2.`Avg Weekly Reach`, 0)))/tt1.`Avg Weekly Reach`) AS `Change in Reach`,
    avg(t1.`Daily Viral Reach`) AS `Avg Daily Viral`,
    (((tt1.`Avg Daily Viral`-IFNULL(tt2.`Avg Daily Viral`, 0)))/tt1.`Avg Daily Viral` AS `Change in Viral`

FROM `clients` t1
JOIN `FB Exports - Key Metrics` t2
ON t1.`id` = t2.`client`

LEFT OUTER JOIN `Master Facebook Data` tt2
ON tt1.`Client ID` = tt2.`Client ID` 
AND month(tt1.`Date`)-month(tt2.`Date`)=1

GROUP BY t2.`client`, month(t2.`Date`)
ORDER BY t2.`client`, t2.`Date`

非常感谢你! =]

1 个答案:

答案 0 :(得分:0)

视图和表格没有那么不同。 SQL将常规视图理解为如何计算它的配方;所以它可以将它连接到相同或任何其他视图,就像它可以将表的复杂连接连接在一起。

无论哪种方式,都没有前一行这样的东西。表和视图本质上是行集,而不是有序的行序列。如果在查询中指定ORDER BY,则在概念上强制执行该排序是应用的最后一个操作。

这并不意味着您的问题无法解决。您没有指定您的数据模型是什么,数据分布的假设等等,但一般而言:

A成为一个观点。让col成为您想要排序的不可为空的唯一约束列(用于定义“前一行”的内容)。现在看看这种查询。

A AS a
LEFT JOIN A AS b ON b.col < a.col
LEFT JOIN A AS c ON c.col < a.col AND c.col > b.col
...
WHERE c.col IS NULL

由于col不可为空,因此WHERE子句有效地说“ ba 之间没有任何内容”。由于b.col要求小于a.col,这意味着ba之前的唯一记录,这就是您想要的。

我再说一遍,确保colNOT NULLUNIQUE(可能是主键),否则这种方法会非常失败。

由于潜在的性能问题,此方法不适用于非常大的数据。在这种情况下,您应该分配一个正确排序的连续序列,这样您就可以使用新的整数列简单地减去1,就像上面的问题一样。