2015-07-31 5 views
-1

У меня есть таблица со структуройMysql - Сравнить элементы массива со значением поля

id | item | order_date | delivery_date 

И у меня есть массив дат, например

$dates = array('2015-06-01', '2015-06-11', '2015-06-26'); 

Что мне нужно сделать, чтобы найти количество предметов, которые при заказе, но еще не доставлены на каждую дату. Из-за сложности моего кода невозможно задать массив и искать каждую дату отдельно.

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

SELECT SUM(id) FROM orders WHERE order_date > IN({implode(",", $dates)}) AND delivery_date < IN ({implode(",", $dates)}) GROUP BY ??? 

Примечание: Я хотел бы GROUP BY каждой даты, указанной в массиве.

+0

Да, я знаю, это был просто пример, чтобы объяснить мою проблему более четко. Я бы посмотрел более старые записи, в которых заполняется delivery_date, например order_date = 2015-04-30 AND delivery_date = 2015-05-05 (это пример массива дат, заданный в моем вопросе) –

+0

Извините, но это так же ясно, как Я мог бы объяснить –

+0

Так жаль. – Strawberry

ответ

1

Использовать подзапрос, который возвращает все даты в массиве. Затем вы можете присоединиться к этому и использовать его столбец в GROUP BY.

$subquery = implode(' UNION ', array_map(function($d) { 
    return "SELECT '$d' AS date"; 
}, $d)); 
$query = "SELECT d.date, SUM(id) 
      FROM orders 
      JOIN ($subquery) AS d ON d.date BETWEEN order_date AND delivery_date 
      GROUP BY d.date"; 

Обратите внимание, что, если заказ соответствует нескольким датам, он будет учитываться для каждого из них.

+0

спасибо, я сделаю это. –

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