代码之家  ›  专栏  ›  技术社区  ›  Elie

mysql列定义

  •  0
  • Elie  · 技术社区  · 15 年前

    使用MySQL5.0,有没有一种方法可以在表中定义一列,每当在该特定行上执行select时,该列就会被计算出来?例如,假设我有两个表,A和B:

    A:
        ID
        COMPUTED_FIELD = SUM(SELECT B.SOME_VALUE FROM B WHERE B.A_ID = ID)
    B:
        ID
        A_ID
        SOME_VALUE
    

    在这个例子中,当我为一个特定的ID在a上运行select时,我希望它为a.id的特定值返回表b中所有值的总和。我知道如何使用多个单独的查询和按a.id分组,但是我正在尝试简化这个过程。

    3 回复  |  直到 15 年前
        1
  •  1
  •   txwikinger    15 年前

    对。在表中不能这样做,但可以在视图中这样做。

    CREATE VIEW A 
    AS 
    SELECT SUM(B.SOME_VALUE) AS COMPUTED_FIELD 
    FROM B 
    WHERE B.A_ID = 'id';
    

    很明显,我需要你在找的东西。

    在这种情况下你不需要A表。

        2
  •  1
  •   anschauung    15 年前

    表不能包含计算值。尝试使用视图。这个 manual entry 有完整的细节。你的最终结果是: CREATE VIEW A AS SELECT SUM('SOME_VALUE'), B.A_ID FROM B; (未经测试)

    也就是说,我不确定为表A提供一个独立的、唯一的ID有多重要——除非您添加另一个表C来保存b.a_id引用的外键,并在创建视图时使用表C作为引用,否则这是不可能的。

        3
  •  1
  •   lc.    15 年前

    正如txwikinger所建议的,最好的方法是设置一个视图,而不是一个表。无论出于何种目的,视图都是一个流线型的、可重用的查询。它们通常用于a)一个公共查询有一个计算列,或b)抽象掉经常使用的复杂连接。

    要展开上一个答案,为了能够查询任何ID,请尝试此视图:

    CREATE VIEW A
    AS
    SELECT B.A_ID AS ID, SUM(B.SOME_VALUE) AS COMPUTED_FIELD
    FROM B
    GROUP BY B.A_ID;
    

    然后您可以正常选择它,例如:

    SELECT A.ID, A.COMPUTED_FIELD
    FROM A
    WHERE A.ID IN (10, 30);
    

    SELECT A.ID, A.COMPUTED_FIELD
    FROM A
    WHERE COMPUTED_FIELD < 5;