我正在尝试实现一个版本控制系统( 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 2SOP日志如下所示:
SOP Index User ID SOP Version
1 1 1
2 1 2
4 1 1因此,这表明用户1已经读取了BBB的最新版本,但尽管v3可用,但只读取了AAA的v2。
我已经设法运行了一个查询,它只显示基于其代码的最新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个表的连接,我正在努力弄清楚!
发布于 2019-01-17 15:38:56
您的查询应该是这样的,以确定您的用户还没有阅读哪个版本。
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')https://stackoverflow.com/questions/54225856
复制相似问题