MySQL запрос на таблицу аудита, чтобы получить последнюю строку, где нет строки удаления для каждого пользователя и типа - PullRequest
0 голосов
/ 11 февраля 2019

так что я уверен, что это никому не облагается налогом, но новичок во всем этом!ищет способ извлечения данных из таблицы аудита, который дает представление обо всех созданных строках, где они впоследствии не были удалены.Итак, в качестве примера ...

CREATE TABLE `test1` (
    `tID` INT(11) NULL DEFAULT NULL,
    `tDate` DATE NULL DEFAULT NULL,
    `tName` VARCHAR(50) NULL DEFAULT NULL,
    `tType` VARCHAR(50) NULL DEFAULT NULL,
    `tAction` VARCHAR(50) NULL DEFAULT NULL
)

INSERT INTO `test1` VALUES (1, '2019-02-01', 'Bob', 'a', 'Create');

INSERT INTO `test1` VALUES (2, '2019-02-02', 'Frank', 'a', 'Create');

INSERT INTO `test1` VALUES (3, '2019-02-03', 'Jim', 'b', 'Create');

INSERT INTO `test1` VALUES (4, '2019-02-04', 'Frank', 'a', 'Delete');

INSERT INTO `test1` VALUES (5, '2019-02-05', 'Bob', 'b', 'Create');

INSERT INTO `test1` VALUES (6, '2019-02-06', 'Bob', 'a', 'Delete');

INSERT INTO `test1` VALUES (7, '2019-02-07', 'Bob', 'a', 'Create');

INSERT INTO `test1` VALUES (8, '2019-02-08', 'Frank', 'b', 'Create');

INSERT INTO `test1` VALUES (9, '2019-02-09', 'Bob', 'b', 'Delete');

INSERT INTO `test1` VALUES (10, '2019-02-10', 'Bob', 'b', 'Create');

INSERT INTO `test1` VALUES (11, '2019-02-11', 'kate', 'a', 'Create');

INSERT INTO `test1` VALUES (12, '2019-02-12', 'kate', 'a', 'Delete');

Хотите, чтобы результат был примерно таким ...

"Bob"   "2019-02-07"    "a"

"Jim"   "2019-02-03"    "b"

"Bob"   "2019-02-10"    "b"

"Frank" "2019-02-08"    "b"

, чтобы я мог получить максимум, где создать достаточно легко, но как я должен исключитьте, которые были удалены после создания?

это приближает меня ... но мне нужно удалить те, которые были удалены позже. SELECT max (tDate), tname, tType FROM test1 WHERE tAction = 'создать 'GROUP BY tname, ttype

спасибо за любую помощь!к.

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019
select  *
from    test1 t1
where   t1.tAction <> 'Delete'
        and not exists
        (
        select  *
        from    test1 t2
        where   t2.tName = t1.tName  -- same user
                and t2.tType = t1.tType -- and same type
                and t2.tAction = 'Delete'  -- deleted
                and t1.tDate < t2.tDate  -- at a later time
        )
0 голосов
/ 11 февраля 2019

Попробуйте использовать коррелированный подзапрос

DEMO

select * from test1 a where a.taction='Create' and not exists
( 
  select 1 from test1 b where a.tname=b.tname and a.ttype=b.ttype
  and a.tdate<b.tdate and b.taction<>'Create'
)

ВЫХОД:

tID tDate       tName   tType   tAction
3   2019-02-03  Jim      b      Create
7   2019-02-07  Bob      a      Create
8   2019-02-08  Frank    b      Create
10  2019-02-10  Bob      b      Create
0 голосов
/ 11 февраля 2019
SELECT
  tDate,
  tname,
  tType
FROM test1
WHERE tAction <> 'Delete'

Я надеюсь, что это запрос, который вы ищете.Ссылка SQL: как выполнить строку, не равную

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...