Php 查看使用最新版本删除历史记录

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

我有这张桌子:

表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           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_文本

在MySQL 8.0中,您可以使用
行编号()
来实现以下目的:

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
)