2013-04-02 3 views
2

Чтобы создать отчет, я должен выбрать некоторую информацию о последнем состоянии транзакции для всех моих клиентов. До сих пор это то, что я получил:Группа с идентификатором max (date_field)

SELECT c.firstname, c.lastname, d.product_name, o.payment, s.name, h.date_add 
FROM ps_orders o 
INNER JOIN ps_order_detail d ON d.id_order = o.id_order 
INNER JOIN ps_customer c ON c.id_customer = o.id_customer 
INNER JOIN ps_order_history h ON o.id_order = h.id_order 
INNER JOIN ps_order_state_lang s ON s.id_order_state = h.id_order_state 
WHERE s.id_lang =6 
GROUP BY c.id_customer 
HAVING MAX(h.date_add) 

Для каждого клиента, этот запрос выбирает первую дату (поле h.date_add), когда мне нужно от последнего. Кажется, что MySQL игнорирует HAVING.

Я попытался сделать подвыбор, но он тоже не работает.

Спасибо любому ответу.

+0

Не должно быть «ИМЕЕТ МАКСИМАЛЬНОЕ (...)« что-то »как'> 1' или какое-то условие? – fedorqui

ответ

4

Здесь у вас должен быть подзапрос, который содержит последние date_add за каждые id_order на столе ps_order_history. Результат подзапроса затем присоединяется обратно к исходной таблице ps_order_history при условии, что он отображается в двух столбцах: date_add и id_order.

SELECT c.firstname, 
     c.lastname, 
     d.product_name, 
     o.payment, 
     s.name, 
     h.date_add 
FROM ps_orders o 
     INNER JOIN ps_order_detail d ON d.id_order = o.id_order 
     INNER JOIN ps_customer c ON c.id_customer = o.id_customer 
     INNER JOIN ps_order_history h ON o.id_order = h.id_order 
     INNER JOIN 
     (
      SELECT id_order, MAX(date_add) max_date 
      FROM ps_order_history 
      GROUP BY id_order 
     ) x ON h.id_order = x.id_order AND 
       h.date_add = x.max_date 
     INNER JOIN ps_order_state_lang s ON s.id_order_state = h.id_order_state 
WHERE s.id_lang =6 
GROUP BY c.id_customer 
+1

Спасибо! Он решил. Просто немного коррекции: ... ВЫБРАТЬ id_order, MAX (h.date_add) max_date ОТ ps_order_history ч GROUP BY h.id_order –

+0

вы радушны ': D' –

+0

о да. 'h.' не должно находиться на' MAX() '. Благодарю. –

3

Чтобы получить последнюю дату, вы должны присоединиться к нему в:

SELECT c.firstname, c.lastname, d.product_name, o.payment, s.name, h.date_add 
FROM ps_orders o 
INNER JOIN ps_order_detail d ON d.id_order = o.id_order 
INNER JOIN ps_customer c ON c.id_customer = o.id_customer 
INNER JOIN ps_order_history h ON o.id_order = h.id_order 
INNER JOIN ps_order_state_lang s ON s.id_order_state = h.id_order_state 
inner join (select o.id_customer, max(oh.date_add) as maxdate from ps_order_history h join ps_order o on h.id_order = o.id_order group by o.id_customer) omax on omax.id_customer = o.id_customer and o.date_add = omax.maxdate 
WHERE s.id_lang =6 
GROUP BY c.id_customer 

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

+0

Таблица ** ps_order_history ** не имеет поля ** id_customer **. ** ps_orders ** имеет. Я попытался это исправить, но не получилось: ... ВЫБРАТЬ o.id_customer, макс (h.date_add) AS MaxDate ОТ ps_order_history ч INNER JOIN ps_orders о ON o.id_order = h.id_order .. , –

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