mysql获取按日期排序的最大状态

时间:2016-12-11 20:23:04

标签: mysql

我面临着对订阅分组行的MySQL查询问题。

表:

statuses (
  id int primary key auto_increment,
  name varchar(30)
);
orders (
  id int primary key auto_increment,
  order_code varchar(10),
  order_date timestamp default current_timestamp,
  user_id int -- fk to users
);
orders_statuses (
  id int primary key auto_increment,
  status_changed timestamp default current_timestamp,
  order_id int, -- fk to orders(id)
  status_id int -- fk to orders(id)
);

现在,我需要在一个查询中加入它们(这很重要,因为我的PHP软件限制了数据库对象 - 不允许子查询,甚至不允许联合)并获得所有可能的订单,但只有最新的状态更改为现状。

状态表中的状态可能会随机插入 - 无法在status_id字段中使用max函数,其中order_id(当前id为新,2为取消,4为付款等)。

按order_id(订单中的ID或order_code)进行分组始终会返回插入到orders_statuses中的第一个可用状态,即使按日期排序也是如此。

我也尝试使用status_changed = max(status_changed),但它不会工作。

所以我的问题是: 我应该如何通过order_id对它们进行分组以获取最后一个,而不是每行可用的第一个状态名称?

//编辑

以下是我尝试从Workbench迁移到PHP DB对象的代码:

select 
    (select l.name from statuses l where l.id = (select t.status_id from orders_statuses t where t.order_id = oh.id order by t.status_changed desc limit 1)) as status,
    oh.order_code, 
    oh.id, 
    oh.order_total, 
    su.name as order_user, 
    oh.order_date as ordered, 
    max(os.status_changed) as updated, 
    oh.id as uid 
from orders oh 
left join orders_statuses os on (oh.id = os.order_id) 
left join users su on (oh.shop_user_id = su.id) 
group by 
    oh.id 
order by 
    oh.order_date desc, 
    os.created desc 

所以基本上我需要更简单的查询来理解它并将其放入$ this-> db-> use(' table',on condition) - > ...-> select(阵列(场))

//编辑

经过几个小时的思考,我可以说我缺乏专业知识。使用

可以解决此问题
SELECT
    status_id,
    created,
    order_id
FROM
    orders_statuses
GROUP BY
    order_id,
    status_id
ORDER BY
    created DESC;

并将其转换为每个order_id仅返回一个status_id,并在单个order_id组中创建max - 这是我需要您帮助的地方。

0 个答案:

没有答案