2014-09-28 75 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閱讀需要引起亂七八糟,piggledy ...

如何解決呢?

+0

創建SQL小提琴將是巨大的... – 2014-09-28 09:23:38

+0

你有什麼打算爲「外鍵」?你可以給我一個例子嗎? – user1499315 2014-09-28 09:42:55

+1

如果您願意,請考慮遵循以下簡單的兩步操作步驟:1.如果您尚未這樣做,請提供適當的DDL(和/或sqlfiddle),以便我們可以更輕鬆地複製問題。 2.如果您尚未這樣做,請提供與步驟1中提供的信息相對應的所需結果集。最後,如果您暫時完全刪除PHP,我們將更容易遵循。 – Strawberry 2014-09-28 10:04:11

回答

0

將您列date_add到ISO datetimestring和/或使用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 2014-09-28 10:20:56

+0

請參閱提供的鏈接回答 – Benvorth 2014-09-28 10:43:34

+0

我試着用TIME_TO_SEC,但切除不是我想要的。我想知道爲什麼只有幾個日期,結果是不正確,因爲我認爲查詢是正確的。如果我只在我收到錯誤結果的日期中添加一秒,結果返回正確。 – user1499315 2014-09-28 10:57:08