【问题标题】:Views in MySQL based on multiple computed valuesMySQL中基于多个计算值的视图
【发布时间】:2009-07-12 21:20:29
【问题描述】:

在上一个问题的后续步骤中,假设我有 3 个表,A、B 和 C。表 A 有一个 ID,用作表 B 和 C 的外键,每个表都有一些值作为属性。对于表A中的每个ID,我想得到表B和C之间的值的差异,可以这样做:

CREATE VIEW T1 AS
    SELECT B.A_ID AS ID, SUM(B.VALUE) AS VAL
    FROM B
    GROUP BY B.A_ID;
CREATE VIEW T2 AS
    SELECT C.A_ID AS ID, SUM(C.VALUE) AS VAL
    FROM C
    GROUP BY C.A_ID;
SELECT T1.ID, T1.VAL, T2.VAL FROM T1, T2 WHERE T1.ID = T2.ID;

问题是,如果表 B 有一些特定 ID 的值,但表 C 没有,反之亦然。在这种情况下,我的 select 语句将不会返回该行。有没有办法让我创建一个单一的视图,它基本上如下所示:

CREATE VIEW T3 AS
    SELECT B.A_ID AS ID, SUM(B.VALUE) AS VAL1, SUB(C.VAL) AS VAL2
    FROM B, C
    WHERE B.A_ID = C.A_ID
    GROUP BY B.A_ID;

如果提供此类视图的创建脚本示例,将不胜感激。

【问题讨论】:

  • 我对最终为您工作的解决方案非常感兴趣。
  • 我可能会尝试,至少,使用你建议的那个。我的托管服务提供商遇到了问题,我的用户访问正在解决的数据库,所以我还不能测试它,尽管我已经准备好了我的脚本。如果您的解决方案有效,我将接受您的正确回答。
  • 原来我的托管服务商只支持MySQL 5.0,并且在MySQL 5.0.1中引入了视图,所以这个自动整理数据的选项就没有了。

标签: mysql


【解决方案1】:

你可以用这个

CREATE VIEW myView AS
SELECT test_a.id, name, IFNULL( (
  SELECT SUM( value ) 
  FROM test_b
  WHERE test_b.a_id = test_a.id
  GROUP BY test_b.a_id ) , 0
) - IFNULL( (
  SELECT SUM( value ) 
  FROM test_c
  WHERE test_c.a_id = test_a.id
  GROUP BY test_c.a_id ) , 0
)
FROM test_a

但是如果 c 的总和大于 b,这将导致负数。如果你想要绝对差异而不是使用这个:

CREATE VIEW myView AS
SELECT test_a.id, name, ABS( IFNULL( (
  SELECT SUM( value ) 
  FROM test_b
  WHERE test_b.a_id = test_a.id
  GROUP BY test_b.a_id ) , 0 ) - IFNULL( (
SELECT SUM( value ) 
  FROM test_c
  WHERE test_c.a_id = test_a.id
  GROUP BY test_c.a_id ) , 0
  )
)
FROM test_a

【讨论】:

  • 考虑到表 B 和 C 都可能有数千行,对于 A 中的数百行,这个查询的性能会是多少? (我会使用第一个选项,因为我需要知道差异是正面还是负面。)另外,有没有办法将其作为视图?
  • 要创建一个视图,只需在查询前面添加 CREATE VIEW viewName AS...至于性能我不知道...您必须尝试一下...我只是设置三个表,每个表有几行。另一个需要考虑的问题是,如果表 a 中的 ID 不在 b 或 c 中...我的查询将返回 0。如果您不想要这个,有办法绕过它。
【解决方案2】:
SELECT ID, MAX(VAL1), MAX(VAL2) FROM 
((SELECT B.A_ID AS ID, SUM(B.VALUE) AS VAL1, 0 as VAL2
FROM B GROUP BY B.A_ID) as T1
UNION
(SELECT C.A_ID AS ID, 0 VAL1, SUM(C.VALUE) AS VAL2
FROM C GROUP BY C.A_ID) as T2) as Foo
GROUP BY FOO.ID

它有点hacky。另外,您不能创建具有联合的视图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-11
    • 1970-01-01
    • 2018-01-13
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多