如何使用来自多行的组合和过滤结果创建 VIEW

Posted

技术标签:

【中文标题】如何使用来自多行的组合和过滤结果创建 VIEW【英文标题】:How to create VIEW witch combined and filtraded result from multiple rows 【发布时间】:2022-01-15 02:08:23 【问题描述】:

您好,我需要完成的任务有问题。 我在 SQL 中有一个表,显示用户(订阅者)的日志,其中包含添加 TIMESTAMP、ACTION PERFORMED 和订阅者名称的触发器,看起来像这样:

表:audit_subscibers

ID Name Action Time
0 John Insert a subscriber 2020-1-1
1 John Deleted a subscriber 2020-3-1
2 Mark Insert a subscriber 2020-4-5
3 Andrew Insert a subscriber 2020-5-1
4 Andrew Updated a subscriber 2020-5-15

现在我需要创建一个仅显示已使用 DELETE TIME 和 INSERTION TIME 删除的订阅者(姓名)的视图,以实现如下目的:

“John”已添加(与其他所有成员一样)但也已被删除,不涉及仅插入的成员

Name Date added Date deleted
John 2020-1-1 2020-3-1
some other 2020-x-x 2020-y-y

如何实现这一点,只取 >1 个条目的订阅者,并且一个条目必须表明用户已被删除:删除了一个订阅者,并结合 RESULT i ONE ROW?

我还有另一个类似的任务,但这次我必须创建视图(仅基于 audit_subscibers 表)我必须只显示仍然存在的订阅者(使用“插入订阅者”获取所有订阅者,但拒绝那些拥有更多订阅者的结果)包括“已删除订阅者”的行

我非常感谢答案...

【问题讨论】:

欢迎来到 SO。这是一个家庭作业问题吗?该结构对于现实世界的用例没有意义。如果是这样,请阅读meta.***.com/questions/334822 你试过什么?对于大多数情况(如果不是全部),您的审计表应该有外键返回到审计表 - subscriber_id 而不是 NameName 不是一个好键。将文本字符串存储在 Action 中效率非常低,并且对于操作表或 ENUM 来说可能是陌生的。 Time 应该是 DATETIME 或 TIMESTAMP。 【参考方案1】:

也许这可以给你一个提示或帮助:

CREATE TABLE  audit_subscibers (
 id int ,
 name varchar(30),
 action varchar(60),
 time date );

INSERT INTO audit_subscibers VALUES
(0,'John','Insert a subscriber','2020-01-01'),
(1,'John','Deleted a subscriber','2020-03-01'),
(2,'Mark','Insert a subscriber','2020-04-05'),
(3,'Andrew','Insert a subscriber','2020-05-01'),
(4,'Andrew','Updated a subscriber','2020-05-15');




SELECT name,
       MAX(case when action='Insert a subscriber' then time end) as Date_added,
       MAX(case when action='Deleted a subscriber' then time end) as Date_deleted
FROM    (
SELECT name,time,action
FROM audit_subscibers
WHERE name in (SELECT name  
               FROM audit_subscibers  
               WHERE action in ('Insert a subscriber','Deleted a subscriber') 
               GROUP BY name
               HAVING COUNT(action) = 2 )

) as t1
group by name;  

结果:

name  Date_added  Date_deleted
John  2020-01-01  2020-03-01

演示https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=ef8a766a516951166161419a75e49cc6

【讨论】:

以上是关于如何使用来自多行的组合和过滤结果创建 VIEW的主要内容,如果未能解决你的问题,请参考以下文章

如何使用来自 msaccess 表的过滤数据填充 vb.net 中的组合框

如何将多行组合在一行中,oracle

如何根据组合框选择过滤datagridview

SQLAlchemy Flask 过滤器查询以组合来自两个模型的结果

如何在OpenCV中组合Gabor过滤器的结果

如何在 Postman 中过滤来自 Docusign Rest API 的报告结果