t-alexashka
@t-alexashka
Сразу пишу legacy код

Актуальный статус заказа и поиск по нему?

Привет друзья!

Встрял с запросом, никак не могу придумать как сделать фильтрацию по статусу заказа.

Есть таблица с заказами:

orders

id | fio  | phone
------------------
25 | Ivan | +7982...


есть таблица со статусами:

orders_log

id  | order_id | action     | action_date
-----------------------------------------------
335 |       25 | CREATED    | 2018-11-09 08:00:00
336 |       25 | APPROVED   | 2018-11-09 08:30:00
336 |       25 | SENT       | 2018-11-09 09:20:00
336 |       25 | CHANGE_SYS | 2018-11-09 09:25:00
...


есть таблица с типами статусов log_actions (технические статусы is_technical = 1 их не показываем операторам, и публичный который могут видеть операторы is_technical = 0)

log_actions

id | action     | is_technical
------------------------------
1  | CREATED    | 0
2  | APPROVED   | 0
3  | SENT       | 0
5  | CHANGE_SYS | 0


операторы видят в вебморде список заказов с текущим статусом. запрос для этого такой:

SELECT 
	`orders`.*, 
	(
		SELECT ol.`action` 
			FROM `orders_log` ol 
			LEFT JOIN log_actions la ON ol.`action` = la.`action` 
		WHERE 
			ol.order_id = orders.id AND 
			la.is_technical = 0 
		ORDER BY  ol.`dttm` 
		DESC LIMIT 1
	) as `status` 
FROM `orders`


и все хорошо и быстро работает до тех пор пока оператор не захочет найти заказы с определенным
текущим статусом. Например все заказы которые на данный момент имеют последний не технический статус "Создан". Для поиска по конкретному статусу дописываю так:

...
FROM `orders`
HAVING (`status`='CREATED')


получается что он вытаскивает сначала все записи (а их много), а потом фильтрует уже. из за этого так долго. А просто status = 'CREATED' выдает ошибку что нет такого поля, т.к. оно динамическое получается, и не работает в WHERE.

Вопрос: как избавится от HAVING в данном случае, чтобы выборки были быстрыми? Мучаюсь страдаю 2-ой день уже.
  • Вопрос задан
  • 190 просмотров
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
А что мешает помимо истории статусов хранить текущий статус заказа непосредственно в таблице заказов? Тогда всё становится гораздо проще.
Ответ написан
kawabanga
@kawabanga
!) log_actions - ACTION должно быть число в таблице. А в приложении - константами.
Вам незачем при каждой выборке иметь лог необходимых статусов. Добавьте поле status в таблицу `orders ` и при изменении статуса, пишите новый статус в лог, и обновляйте из основной таблицы.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы