2016-10-02 62 views
0
CREATE TABLE IF NOT EXISTS `order_order_status` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `order_status_id` int(11) NOT NULL, 
    `order_id` int(11) NOT NULL, 
    `created_at` timestamp NULL DEFAULT NULL, 
    `updated_at` timestamp NULL DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `order_order_status_order_status_id_index` (`order_status_id`), 
    KEY `order_order_status_order_id_index` (`order_id`), 
    KEY `order_order_status_created_at_index` (`created_at`), 
    KEY `order_order_status_updated_at_index` (`updated_at`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=5 ; 

-- 
-- Dumping data for table `order_order_status` 
-- 

INSERT INTO `order_order_status` (`id`, `order_status_id`, `order_id`, `created_at`, `updated_at`) VALUES 
(1, 2, 1, '2016-10-01 01:57:37', '2016-10-01 01:57:37'), 
(2, 2, 2, '2016-10-01 01:57:54', '2016-10-01 01:57:54'), 
(3, 2, 3, '2016-10-02 02:12:49', '2016-10-02 02:12:49'), 
(4, 6, 3, '2016-10-02 02:14:19', '2016-10-02 02:14:19'); 

我想選擇是:MAX()+按預期在MySQL不工作

1, 2, 1, '2016-10-01 01:57:37', '2016-10-01 01:57:37' 
2, 2, 2, '2016-10-01 01:57:54', '2016-10-01 01:57:54' 
4, 6, 3, '2016-10-02 02:14:19', '2016-10-02 02:14:19' 

是order_order_status由ORDER_ID

現在的問題分組的最新條目:

運行

select *, max(created_at) from `order_order_status` group by `order_order_status`.`order_id` 

返回我:

enter image description here

或PROSA

它返回我不是最新的條目,而是返回一個ORDER_ID 3

+0

MySQL不保證該行將在這種情況下返回。它只是隨機挑選一個。從這個意義上說,它的運作如預期。 [「服務器可以自由選擇每個組中的任何值,因此除非它們相同,否則所選的值是不確定的」](https://dev.mysql.com/doc/refman/5.7/en/group-by -handling.html) – sstan

回答

2

MySQL的舊的工作正是預期。問題是你的期望。

select *group by沒有意義。你想獲得最大的,做這樣的事情:

select oos.* 
from order_order_status 
where oos.created_at = (select max(oos2.created_at) 
         from order_order_status oos2 
         where oos2.order_id = oos.order_id 
         ); 

聚合(group by)產生每組一行。一個聚合函數(如max())獲得一列的最大值 - 僅此而已。它只是在一列上運行。

當您使用select *時,有許多列不在group by中,而不是聚合列的參數。 MySQL允許使用這種語法(不幸的是 - 其他數據庫很少)。未聚合列的值是來自組中不確定行的任意值。

+0

'from group by'? oos和oos2未定義 – Toskan

+0

如果created_at不唯一,該怎麼辦? – Toskan

+0

爲什麼不只是使用像這樣簡單的東西:http://stackoverflow.com/questions/18221999/group-by-having-max-date/35985225#35985225 – Toskan

0

使用ORDER BY ORDER_ID遞減可以解決你的問題

select *, max(created_at) from `order_order_status` group by `order_order_status`.`order_id` order by `order_order_status`.`order_id` desc