Php 查看使用最新版本删除历史记录
我有这张桌子: 表S_文本:Php 查看使用最新版本删除历史记录,php,mysql,subquery,window-functions,sql-view,Php,Mysql,Subquery,Window Functions,Sql View,我有这张桌子: 表S_文本: PS_TEXT S_TEXT VS_TEXT D_TEXT 1 1 1 Hey 2 1 1 Hello 3 1 2 Oh 4 2 1 Hallo 5
PS_TEXT S_TEXT VS_TEXT D_TEXT
1 1 1 Hey
2 1 1 Hello
3 1 2 Oh
4 2 1 Hallo
5 2 1 Hallo
6 2 2 Hi
然后,我使用此视图删除所有历史双精度:
CREATE OR REPLACE VIEW `VHS_TEXT`
AS SELECT
`S_TEXT`.`PS_TEXT`,
`S_TEXT`.`S_TEXT`,
`S_TEXT`.`VS_TEXT`,
`S_TEXT`.`D_TEXT`
FROM
`S_TEXT` LEFT JOIN
`S_TEXT` AS `t2`
ON (
`S_TEXT`.`S_TEXT` = `t2`.`S_TEXT` AND `S_TEXT`.`PS_TEXT` < `t2`.`PS_TEXT`
)
WHERE
`t2`.`PS_TEXT` IS NULL;
然后,我使用此视图来显示不带双精度的版本:
CREATE OR REPLACE VIEW `VVS_TEXT`
AS SELECT
`S_TEXT`.`PS_TEXT`,
`S_TEXT`.`S_TEXT`,
`S_TEXT`.`VS_TEXT`,
`S_TEXT`.`D_TEXT`
FROM
`S_TEXT` LEFT JOIN
`S_TEXT` AS `t2`
ON (
`S_TEXT`.`S_TEXT` = `t2`.`S_TEXT`
AND `S_TEXT`.`VS_TEXT` = `t2`.`VS_TEXT`
AND `S_TEXT`.`PS_TEXT` < `t2`.`PS_TEXT`
)
WHERE
`t2`.`PS_TEXT` IS NULL;
现在,我插入一个新行实例2版本1:
PS_TEXT S_TEXT VS_TEXT D_TEXT
1 1 1 Hey
2 1 1 Hello
3 1 2 Oh
4 2 1 Hallo
5 2 1 Hallo
6 2 2 Hi
7 2 1 Hi too
现在我在VHS_文本中得到了这一点:
PS_TEXT S_TEXT VS_TEXT D_TEXT
3 1 2 Oh
6 2 2 Hi
PS_TEXT S_TEXT VS_TEXT D_TEXT
3 1 2 Oh
7 2 1 Hi too
但我想要这个:
PS_TEXT S_TEXT VS_TEXT D_TEXT
3 1 2 Oh
6 2 2 Hi
所需的查询/视图可以这样定义:
- 每个不同的S_文本对应一行
- 显示最新版本的S_文本与最新版本的PS_文本
行编号()
来实现以下目的:
create view vhs_text as
select ps_text, s_text, vs_text, d_text
from (
select
s.*,
row_number() over(partition by s_text order by vs_text desc) rn
from s_text s
) x
where rn = 1
:
| ps_text | s_text | vs_text | d_text |
| ------- | ------ | ------- | ------ |
| 3 | 1 | 2 | Oh |
| 6 | 2 | 2 | Hi |
在早期版本中,可以将
不存在
条件与相关子查询一起使用:
create view vhs_text as
select *
from s_text s
where not exists (
select 1
from s_text s1
where s1.s_text = s.s_text and s1.vs_text > s.vs_text
)
(相同的结果)是的,但不幸的是我没有MySQL 8。MySQL 8无疑是一个重大的升级,它为MySQL世界带来了许多优秀的Oracle功能:-)@HenrikHansen:我用一个早期版本的解决方案更新了我的答案。它实际上在更大范围内无法工作。它只对给定的数据有效,因为最新版本只有一个条目。@HenrikHansen:这没有显示在示例数据中。。。您希望如何处理该用例?是的,示例数据不够全面。然而,用例被解释为获取最新版本中的最新版本,而不是获取可能不是最新版本的最新版本。
create view vhs_text as
select *
from s_text s
where not exists (
select 1
from s_text s1
where s1.s_text = s.s_text and s1.vs_text > s.vs_text
)