MySQL - 将 View 加入 ITSELF

标签 mysql join view self-join

我正在使用 MySQL 5.0。

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

我知道这是我的错误代码,缺乏逻辑,但它显示了我想要完成的事情:

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`

非常感谢! =]

最佳答案

View 和表并没有什么不同。 SQL 将常规 View 理解为如何计算它的方法;因此它可以将它连接到相同或任何其他 View ,就像它可以将复杂的表连接在一起一样。

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

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

A 成为一个 View 。让 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,这意味着 b 之前的唯一记录a 这就是你想要的。

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

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

关于MySQL - 将 View 加入 ITSELF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11108584/

相关文章:

mysql - 在 MySQL 中使用 CASE 语句更新多行

c# - 使用 Datagridview C# 更新 MySql 数据库

mysql - 通过内部连接或左/右连接替换与标量子查询的比较

SQL joining,从子查询求和计算总聚合量

unix - 使用 Unix JOIN 命令合并两个文件

MySQL 查询从单个表中查找相关行

javascript - 切换 View 不会以 Angular 切换 Controller

iphone - presentModalView 从我的横向应用程序的侧面进来

asp.net-mvc - 如何停止 ValidationMessageFor 在加载时显示错误消息?

php - 如何根据表中的列值连接表