我面临着对订阅分组行的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 - 这是我需要您帮助的地方。