Выберите последнюю запись истории из db

Эксперты, я запертые в confusion.I есть таблица , order_historyкоторая содержит запись всех действий , которые я выполнить на заказ , как confirm order, attempted order, reject orderили revert order.

Когда сотрудник маркирует порядок, когда attemptон создает возврат, и через некоторое время администратор отправляет attemptзаказ обратно в свое первоначальное место (он также создает историю). После этого другой сотрудник отмечает тот же порядок, что и history.

проблема

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

Структура БД

|history_id |order_id | date_added   |user_id | action_id|
|-----------|---------|--------------|--------|----------|
| 13        | 444     | 2018/07/06   |   9    |2         |
| 12        | 555     | 2018/07/05   |   7    |2         |
| 11        | 444     | 2018/07/05   |   2    |3         |
| 10        | 555     | 2018/07/05   |   2    |3         |
| 9         | 555     | 2018/07/05   |   4    |2         |
| 8         | 444     | 2018/07/04   |   1    |2         |

Где user_id= Employee и action_id, 2 for attemptи 3 for revert backкогда при попытке заказа вернется, а затем снова попытается другой сотрудник, мой запрос дублирует заказ как у сотрудников A, так и B, но он должен отображаться в последней учетной записи сотрудника.

Мой запрос

SELECT COUNT(oh.order_id) AS total_attempted,
       oh.user_id
FROM `order_history` oh 
WHERE oh.action_id = '2'
GROUP BY oh.user_id

результат

Этот запрос отображается order ID : 555для обоих пользователей, user_id: 4 and 7но заказ 555 должен отображаться только для пользователя 7.

Ожидаемый результат

|history_id |order_id | date_added   |user_id | action_id|
|-----------|---------|--------------|--------|----------|
| 13        | 444     | 2018/07/06   |   9    |2         |
| 12        | 555     | 2018/07/05   |   7    |2         |

PS: Все действия по заказу 555 были выполнены в тот же день

Лемм знает, требуется ли более подробная информация.

mysql,sql,database,mysqli,php-mysqlidb,

0

Ответов: 1


1 принят

Ваш ожидаемый результат не совпадает с вашим запрограммированным кодом. Если вы хотите только последнюю попытку, вам нужно посмотреть на попытки И реверсии.

drop table if exists oh;
create table oh (history_id int,order_id int,date_added varchar(100),user_id int,action_id int);
insert into oh (history_id ,order_id,date_added,user_id,action_id) values(13,444,"2018/07/06",9,2);
insert into oh (history_id ,order_id,date_added,user_id,action_id) values(12,555,"2018/07/05",7,2);
insert into oh (history_id ,order_id,date_added,user_id,action_id) values(11,444,"2018/07/05",2,3);
insert into oh (history_id ,order_id,date_added,user_id,action_id) values(10,555,"2018/07/05",2,3);
insert into oh (history_id ,order_id,date_added,user_id,action_id) values(9,555,"2018/07/05",4,2);
insert into oh (history_id ,order_id,date_added,user_id,action_id) values(8,444,"2018/07/04",1,2);
insert into oh values(7,333,"2018/07/04",1,3),(6,333,"2018/07/04",1,2),
(5,222,"2018/07/04",1,2),(4,222,"2018/07/04",2,2),
(3,111,"2018/07/04",1,2);

Sub-запрос s находит последнее действие на основе history_id (я предполагал, что это указывает порядок событий)

В этом коде перечислены последние попытки

select * from
(
select *
from   oh 
where  action_id in (2,3) and 
         history_id = (select max(history_id) from oh oh1 where oh1.order_id = oh.order_id)
) s
where s.action_id = 2;

+------------+----------+------------+---------+-----------+
| history_id | order_id | date_added | user_id | action_id |
+------------+----------+------------+---------+-----------+
|         13 |      444 | 2018/07/06 |       9 |         2 |
|         12 |      555 | 2018/07/05 |       7 |         2 |
|          5 |      222 | 2018/07/04 |       1 |         2 |
|          3 |      111 | 2018/07/04 |       1 |         2 |
+------------+----------+------------+---------+-----------+
4 rows in set (0.02 sec)

Этот код подсчитывает количество попыток (исключая реверсии пользователя)

select user_id,count(*) attempts
from
(
select *
from   oh 
where  action_id in (2,3) and 
         history_id = (select max(history_id) from oh oh1 where oh1.order_id = oh.order_id)
) s
where s.action_id = 2
group by user_id;

+---------+----------+
| user_id | attempts |
+---------+----------+
|       1 |        2 |
|       7 |        1 |
|       9 |        1 |
+---------+----------+
3 rows in set (0.00 sec)
MySQL, MS SQL, базы данных, MySQLi, PHP-mysqlidb,
Похожие вопросы