如何使用来自多行的组合和过滤结果创建 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
而不是 Name
。 Name
不是一个好键。将文本字符串存储在 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 中的组合框