我正在尝试实现一个版本控制系统(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')