2016-02-14 3 views
0

Я создаю модуль отчетности для клиента, и их текущий процесс затрудняет выполнение того, что я пытаюсь сделать. База данных - это MySQL, модуль написан на PHP.Выбор следующего появления определенной записи в MySQL

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

Но мне это нужно для выполнения двух отдельных запросов.

Я могу получить идентификатор заказа, где они обрабатываются. Моя проблема связана со вторым запросом, который я делаю:

SELECT * FROM status_history WHERE orders_id IN {list_of_ids} AND status = 'shipped' GROUP BY orders_id.

Моя проблема заключается в том, что строка состояния «отправлено», которую производит этот запрос, может быть до/после требуемого.

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

Что мне нужно сделать, это: SELECT * FROM status_history WHERE orders_id IN <list_of_ids> AND status = 'shipped' AND date_added > {date at processing} AND date_added < {date at next occurrence of processing, if there is one} GROUP BY orders_id

+0

Почему два запроса? – Strawberry

+0

@Strawberry Мне нужно скомпилировать список всех идентификаторов из первого, независимо от того, отправлены они или нет, а затем, если они отправлены, мне нужна дополнительная информация. – David

+0

Обычно это один запрос с внешним соединением. Рассмотрите возможность предоставления некоторых выборочных данных (в идеале sqlfiddle) и желаемого результата в качестве редактирования вашего вопроса. – Strawberry

ответ

1

Не используйте SELECT * с GROUP BY. Это признак плохого запроса и неясного мышления. Откуда берутся значения для всех столбцов - те, которые не указаны в предложении GROUP BY?

Если вы хотите дату первой поставки, то вы можете получить эту дату:

SELECT sh.orders_id, MIN(date_aded) as FirstShippedDate 
FROM status_history sh 
WHERE sh.orders_id IN <list_of_ids> AND sh.status = 'shipped' AND 
     sh.date_added > {date at processing} AND 
     sh.date_added < {date at next occurrence of processing, if there is one} 
GROUP BY orders_id; 

Примечания: Вы, наверное, не нужны два запроса. Вы должны иметь возможность использовать подзапрос, чтобы сгенерировать список и использовать его в этом запросе.

И если вам нужна полная запись, присоедините этот результат к исходной таблице.

+0

Спасибо за ваш ответ. Я делаю группу, потому что в один и тот же день может быть 5 или 6 экземпляров одного заказа, установленного для обработки. Мне нужно только самое последнее. Моя проблема не выходит из первой отправленной даты. Это я могу сделать. Он получает следующее появление доставки из таблицы, учитывая возникновение обработки. – David

Смежные вопросы