【问题标题】:Mysql View complexMysql 查看复杂
【发布时间】:2021-02-02 00:15:16
【问题描述】:
我的表 +------------------+----------+-------- ---------+ |字段1 |字段2 |字段3 | +------------------+----------+-------- ---------+ | 1 | 10 | | | 1 | 20 | | | 2 | 100 | | | 2 | 200 | | | | | 1 | | | | 2 | +------------------+----------+-------- ---------|

我想创建一个显示此结果的视图

myview 想要的结果 +------------------+----------+-------- ---------+ |字段1 |字段2 |字段3 | +------------------+----------+-------- ---------+ | 1 | 10 | | | 1 | 20 | | | 2 | 100 | | | 2 | 200 | | | | 30 | 1 | | | 300 | 2 | +------------------+----------+-------- ---------|

30 是 field2 的总和,其中 field1=1(field3 的值)

300 是 field2 的总和,其中 field1=2(field3 的值)

我的mysql查询是

CREATE VIEW myview AS 
SELECT
  field1, if(field3>0,sum(field2) where field1=field3,field2), field3 
FROM mytable

但不行,我有 NULL 值而不是 30 和 300

另一种情况:嵌套情况 我的表

+------------------+----------+-------- ---------+ |字段1 |字段2 |字段3 | +------------------+----------+-------- ---------+ | 1 | 10 | 0 | | 1 | 20 | 0 | | 2 | 100 | 0 | | 2 | 200 | 0 | | 3 | | 1 | | 3 | | 2 | | 4 | | 3 | +------------------+----------+-------- ---------|

myview 想要的结果

+------------------+----------+-------- ---------+ |字段1 |字段2 |字段3 | +------------------+----------+-------- ---------+ | 1 | 10 | 0 | | 1 | 20 | 0 | | 2 | 100 | 0 | | 2 | 200 | 0 | | 3 | 30 | 1 | | 3 | 300 | 2 | | 4 | 330 | 3 | +------------------+----------+-------- ---------|

如何获得 30,300 和 330 的值?

【问题讨论】:

    标签: mysql view


    【解决方案1】:

    此查询假定您清空列实际上是 NULL,否则您必须熟练使用 IF 子句 fot field3

    这使用了一个事实,即您可以创建一个子查询,为特定的 mytable 字段 1 暂停字段 2 的值

    CREATE TABLE mytable (
      `field1` INTEGER,
      `field2` INTEGER,
      `field3` INTEGER
    );
    
    INSERT INTO mytable
      (`field1`, `field2`, `field3`)
    VALUES
      ('1', '10', NULL),
      ('1', '20', NULL),
      ('2', '100', NULL),
      ('2', '200', NULL),
      (NULL, NULL, '1'),
      (NULL, NULL, '2');
    
    SELECT `field1`
    , IF( `field3` IS NOT NULL ,(SELECT SUM(`field2`) FROM mytable WHERE `field1` = t1.`field3`) ,`field2`) 'field2'
    , `field3` 
    FROM mytable t1
    
    字段1 |字段2 |字段3 -----: | -----: | -----: 1 | 10 | 1 | 20 | 2 | 100 | 2 | 200 | | 30 | 1 | 300 | 2

    db小提琴here

    【讨论】:

    • 现在我编辑了另一个案例。 嵌套情况
    • 您必须提出一个新问题,而不是向您的问题添加新信息并进行更改。
    • 这与嵌套有关,它是递归的,需要 mysql 8 或者你真的很短地开始在 hirachical 树中。祝你好运
    • 请务必接受答案,就像我在另一条评论中写的那样,当您提出与您的问题相关的新问题时,这将更加复杂,您还需要发布您的 mysql 版本。就像我写的那样,mysql 已经大大改善了这样的 hiracy 问题,因为它可以进行递归 cte
    【解决方案2】:

    关闭。您需要加入才能获得总和。

    SELECT m.field1, if(m.field3>0,sum(m2.field2),m.field2) as field2, m.field3
    from mytable m
    left join mytable m2 on m2.field1=m.field3
    group by m.field1, m.field2, m.field3
    

    【讨论】:

    • ysth ....现在我编辑了另一个案例。嵌套情况
    • 你应该问一个新问题。添加select version(); 的输出,并说明是否有最大数量的嵌套级别。理想情况下,将您的模式和示例数据提供为创建表并在小提琴中插入,例如dbfiddle.uk/?rdbms=mysql_8.0
    • 如果这个答案对你有帮助,请考虑支持它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2012-11-17
    • 2015-07-28
    • 1970-01-01
    相关资源
    最近更新 更多