Запрос, если у пользователя есть журнал, соответствующий самой последней версии документа с использованием MySQL - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь внедрить систему контроля версий (СОП), в которой эти документы регулярно пересматриваются и отслеживают, читали ли пользователи самую последнюю версию СОП.

Я могу перечислить все СОП, где пользователь прочитал самую последнюю версию, но я не могу перечислить все СОП, которые, например, устарели, например. для уведомлений, что они должны прочитать их.

Таблица 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, но прочитал только v2 AAA, хотя v3 доступен.

Мне удалось выполнить запрос, который отображает только самые последние СОП на основе его кода, например, сверху 3, ааа, 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 таблицы, я изо всех сил пытаюсь понять это !

1 Ответ

0 голосов
/ 17 января 2019

Ваш запрос должен быть таким, чтобы выяснить, какую версию ваш пользователь еще не прочитал.

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')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...