Требуется SQL Запрос для извлечения данных из таблицы для MYSQL - PullRequest
1 голос
/ 20 апреля 2020

У меня есть таблица, в которой есть столбцы, такие как ID, USER, PreviousValue, CurrentValue, Date.

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

Пример: если в таблице есть последняя запись для пользователя A и запрос предназначен для пользователя B, идентификатор пользователя, пользователь, предыдущее значение, дата должны быть возвращены для пользователя B, но текущее значение должно быть для пользователь A.

ID   Previous  Current  User     createdOn
1    RED       BLUE     System   14-MAR-2020
2    GREEN     YELLOW   ADMIN    12-MAR-2020 

IF I query for ADMIN as user the row returned should contain  below data:

ID   Previous  Current  User     createdOn
2    GREEN     BLUE     ADMIN    12-MAR-2020

Поскольку последняя строка была добавлена ​​14 МАРТА, текущее значение должно быть получено из этой строки, в остальном все данные должны принадлежать пользователю, которого я запросил.

Ответы [ 2 ]

1 голос
/ 20 апреля 2020

ВНИМАНИЕ! Проблема формата даты

Я настоятельно призываю вас преобразовать столбец CreadedOn в тип данных DATE вместо VARCHAR, чтобы получить соответствующий порядок значений по дате.
В противном случае 14-MAR-2020 будет считаться позже, чем 11-DEC-2020.

Пример выпуска DB-Fiddle

Схема

CREATE TABLE users (
  `ID` INTEGER,
  `Previous` VARCHAR(5),
  `Current` VARCHAR(6),
  `User` VARCHAR(18),
  `createdOn` VARCHAR(20)
);


INSERT INTO users
  (`ID`, `Previous`, `Current`, `User`, `createdOn`)
VALUES
  ('1', 'RED', 'BLUE', 'System', '14-MAR-2020'),
  ('2', 'GREEN', 'YELLOW', 'ADMIN', '12-MAR-2020'),
  ('3', 'GREEN', 'PURPLE', 'System', '11-DEC-2020'),
  ('4', 'GREEN', 'YELLOW', 'System', '10-MAR-2020');

Другой ответ на запрос { ссылка }

select
  Id,
  Previous,
  User,
  CreatedOn,
  (
    select Current
    from users
    order by CreatedOn desc
    limit 1
   ) as Current
from users
where `user` = 'ADMIN'
order by createdon desc
limit 1;
| Id  | Previous | User  | CreatedOn   | Current |
| --- | -------- | ----- | ----------- | ------- |
| 2   | GREEN    | ADMIN | 12-MAR-2020 | BLUE    |

Ожидаемый ток PURPLE


Чтобы устранить проблему с сортировкой по дате, вам необходимо изменить таблицу с помощью функции STR_TO_DATE().

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

Пример DB-Fiddle

ALTER TABLE users
ADD COLUMN createdOn_Date DATE NULL DEFAULT NULL;

UPDATE users
SET CreatedOn_Date = STR_TO_DATE(CreatedOn, '%d-%b-%Y')
WHERE CreatedOn_Date IS NULL;


ALTER TABLE users
DROP COLUMN CreatedOn,
CHANGE COLUMN CreatedOn_Date CreatedOn DATE;

Затем отобразите свои записи в нужном формате, используйте функцию DATE_FORMAT()

Другой ответ на запрос * 1 060 *{ ссылка }

select
  Id,
  Previous,
  User,
  DATE_FORMAT(CreatedOn, '%d-%b-%Y') AS CreatedOn,
  (
    select Current
    from users
    order by CreatedOn desc
    limit 1
  ) as Current
from users
where `user` = 'ADMIN'
order by createdon desc
limit 1;

Результат

| Id  | Previous | User  | CreatedOn   | Current |
| --- | -------- | ----- | ----------- | ------- |
| 2   | GREEN    | ADMIN | 12-Mar-2020 | PURPLE  |
0 голосов
/ 20 апреля 2020

Подзапрос для получения последнего текущего значения должен это сделать.

select
  Id,
  Previous,
  User,
  CreatedOn,
  (
    select Current
    from users
    order by CreatedOn desc
    limit 1
   ) as Current
from users
where user = ?
order by createdon desc
limit 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...