|
|
|
| Доброго времени суток.
Имею две таблицы.
Одна для записи заказов вида (orders)
order_id
order_status
order...
|
Другая для тех кто выполняет заказы (рабочии) (users)
user_id
user_last_act
user_last_order_id
|
Не могу организовать запрос такого вида.
Извлечь все заказы, у которых статус равен 1 и не заняты рабочими более как 3 часов.
Пробывал запрос типа, но выдает весь список заказов, а при свободных рабочих - дублирует.
SELECT order_id, order...
FROM orders
LEFT JOIN users ON user_last_order_id!=order_id
WHERE order_status=1 AND user_last_act<time()-60*60*3
|
Может у вас имеются какието идеи на этот счет? Заранее спасибо
Суть просто отфлиртовать занятые айди заказов рабочими. | |
|
|
|
|
|
|
|
для: Vitaleks
(27.12.2010 в 01:56)
| | a LEFT JOIN b ON cond
устроен таким, что выбирает все строки из таблицы a, независимо от того, выполняется условие cond или нет. Просто если оно не выполняется поля из таблицы b будут выданы как NULL .
И только потом в ход вступает фильтр по условию WHERE.
Далее. Условие сопоставления строк cond в Вашем запросе увязывает строки заказов со строками исполнителей. Только почему-то заказ X увязывается со всеми возможными исполнителями, за исключением тех, которые в него вовлечены. Смысл проверки поля user_last_act в таких строках - никакой вообще.
В разделе WHERE у Вас написано user_last_act < значение . Это выражение будет истинным лишь тогда, когда user_last_act не NULL, а значит попытка отобрать несвязанные строки провалится.
Чтобы поправить положение, я бы начал с того, что составил бы запрос с правильным условием сопоставления строк.
Затем добавил бы в него условие времени активности.
И только потом отделял бы сопоставленные строки от несопоставленных - уже в разделе WHERE.
Если будете следовать такой схеме - всё получится.
Действуйте. | |
|
|
|