首页 > 解决方案 > 使用 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,但是虽然 v3 可用,但只阅读了 v2 的 AAA。

我已经设法运行了一个查询,该查询仅显示基于其代码的最新 SOP,例如从上面 3, AAA, 3 | 4、血脑屏障、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 个表加入,我正在努力弄清楚!

标签: mysqldatabasejoin

解决方案


您的查询应该是这样来确定您的用户尚未阅读的版本。

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')

推荐阅读