2014-09-28 4 views
0

Здравствуйте у меня есть таблица с:GROUP BY не работает хорошо

id_order | id_order_history | date_add 

С помощью этого запроса я могу получить все заказы, которые имеют id_order_history = 3 (в стадии подготовки)

SELECT 
     `oh`.`id_order` 
    FROM (
     SELECT MAX(`date_add`) AS date_add 
     FROM `'._DB_PREFIX_.'order_history` 
     GROUP BY `id_order` 
    ) AS h 
    INNER JOIN 
     '._DB_PREFIX_.'order_history AS oh 
    ON 
     `h`.`date_add` = `oh`.`date_add` 
    INNER JOIN 
     '._DB_PREFIX_.'orders AS o 
    ON 
     `oh`.`id_order` = `o`.`id_order`'; 

    $sql .= 'WHERE 
     oh.`id_order_state` = '.$status.''; 
    $sql .= ' AND 
     oh.date_add >= "'.$start.'"'; 
    $sql .= ' AND 
     oh.date_add <= "'.$end.'" 
    ORDER BY 
     `oh`.`id_order` ASC 

Проблема заключается в том, что для некоторых заказать SELECT MAX не получить правильное значение date_add

id_order | id_order_history | date_add 

1  | 5    | 25-09-2014 18:07:59 ---> this is the correct value 
1  | 4    | 25-09-2014 18:07:51 
1  | 3    | 25-09-2014 18:06:42 ---> but query return this 

Если бы я добавьте на дату 1 секунда (18:06:43) запрос вернет правильное значение 25-09-2014 18:07:59

Я просто не могу понять, как решить проблему.

Я читал вокруг, что иногда GROUP BY принимает результаты сумбурный ...

, как я могу это исправить?

+0

создание SQL скрипку было бы здорово ... –

+0

Что вы намерены для «внешнего ключа»? Можете ли вы привести мне пример? – user1499315

+1

Если вам нравится, рассмотрите следующий простой двухэтапный курс действий: 1. Если вы еще этого не сделали, предоставьте надлежащие DDL (и/или sqlfiddle), чтобы мы могли легче реплицировать проблему. 2. Если вы еще этого не сделали, укажите желаемый набор результатов, соответствующий информации, представленной на шаге 1. Наконец, нам было бы намного легче следовать, если вы полностью удалили PHP. – Strawberry

ответ

0

Преобразование столбца date_add в datetimestring ISO и/или использовать TO_SECONDS (см MySQL doc here)

...(SELECT FROM_UNIXTIME(MAX(TO_SECONDS(`date_add`))) AS date_add 
    FROM `'._DB_PREFIX_.'order_history` 
    GROUP BY `id_order`) AS h 
+0

ФУНКЦИЯ TO_SECONDS не существует :( – user1499315

+0

см. Предоставленную ссылку в ответе – Benvorth

+0

Я пробовал с TIME_TO_SEC, но результаты не то, что я хочу. Я хочу знать, почему только за несколько дней, результат Неправильно, потому что я думаю, что запрос верный. Если я добавлю только одну секунду в дату, когда я получаю неправильный результат, результат вернется правильно. – user1499315

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