查询用户的日志是否与使用MySQL的文档的最新版本相匹配



我正在尝试实现一个版本控制系统(SOP),在该系统中,这些文档会定期修订,并跟踪用户是否阅读了SOP的最新版本。

我可以列出用户阅读过最新版本的所有SOP,但我不能列出所有过期的SOP,例如需要阅读的通知。

SOP表可能包含倍数,例如

SOP Index   SOP Code    SOP Version
1             AAA               1
2             AAA               2
3             AAA               3
4             BBB               1
5             CCC               1
6             CCC               2

SOP日志如下所示:

SOP Index    User ID     SOP Version
1           1            1
2           1            2
4           1            1

因此,这表明用户1已经读取了最新版本的BBB,但只读取了AAA的v2,尽管v3是可用的。

我已经设法运行了一个查询,根据其代码只显示最新的SOP,例如3、AAA、3|4、BBB、1|6、CCC,2,但我很难找到如何将其与一个单独的表进行比较,该表记录SOP索引、用户和版本号,并确定他们是否读过最新版本。

这选择了最新的SOP:

SELECT a.sop_group, a.sop_code, a.sop_version, a.sop_title, a.sop_issued, 
c.log_sop_version
FROM data_sops a
INNER JOIN (
SELECT sop_code, MAX(sop_version) sop_version, sop_index
FROM data_sops
GROUP BY sop_code) b ON a.sop_code = b.sop_code AND a.sop_version = b.sop_version

我已经设法扩展到选择用户阅读过的最新版本的SOP:

SELECT a.sop_group, a.sop_code, a.sop_version, a.sop_title, a.sop_issued, c.log_sop_version
FROM data_sops a
INNER JOIN (
SELECT sop_code, MAX(sop_version) sop_version, sop_index
FROM data_sops
GROUP BY sop_code) b ON a.sop_code = b.sop_code AND a.sop_version = b.sop_version
LEFT JOIN log_sops c ON a.sop_index = c.log_sop_sop_index
WHERE c.log_sop_user_index = '$userid' AND c.log_sop_version = a.sop_version

我认为WHERE c.log_sop_user_index = '$userid' AND c.log_sop_version = a.sop_version行可以将运算符从=更改为<>以产生相反的效果,但它似乎并不是那么简单,3张表的加入值,我很难弄清楚!

您的查询应该是这样的,以确定您的用户还没有阅读哪个版本。

select data_sops.sop_index,data_sops.sop_code,data_sops.sop_version
from data_sops 
join (SELECT sop_code, MAX(sop_version) sop_version 
FROM data_sops GROUP BY sop_code) a 
on data_sops.sop_code = a.sop_code 
and data_sops.sop_version = a.sop_version 
where not exists 
(select log_sop_sop_index from log_sops 
where data_sops.sop_index = log_sop_sop_index 
and log_sop_user_index = '$userid')

最新更新