Привет друзья!
Встрял с запросом, никак не могу придумать как сделать фильтрацию по статусу заказа.
Есть таблица с заказами:
ordersid | fio | phone
------------------
25 | Ivan | +7982...
есть таблица со статусами:
orders_logid | 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_actionsid | 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-ой день уже.