[英]MySQL join, most recent, group by, limit to 1 result per id
目前,我正在开发一个系统,以允许公司及其各个部门查看订单的状态。 我通过在订单管理表中存储逗号分隔的“状态”来做到这一点,以便我们可以跟踪递归(员工在哪一天做了什么等)
SQL提琴: http ://sqlfiddle.com/#!2/ 91cd6a
o.id Order# om.id status
-- ---- -- ----
1 1 2 Delivered
3 2 4 Order Received
3 2 4,5 Order On Hold (parts needed)
4 2 4,5,6 Ready for Delivery
5 2 4,5,6,2 Delivered
6 3 2 Delivered
我想要的结果将是这样的:
3 => [Order: 3, Status: 2]
2 => [Order: 2, Status: 2,4,5,6]
1 => [Order: 1, Status: 2]
但是我目前正在得到所有结果。
3 => [Order: 3, Status: 2]
2 => [Order: 2, Status: 2,4,5,6]
2 => [Order: 2, Status: 4,5,6]
2 => [Order: 2, Status: 5,6]
1 => [Order: 1, Status: 2]
这是我正在使用的当前查询:
"SELECT * FROM orders LEFT JOIN orders_mgmt ON orders_mgmt.om_order_id = orders.orders_ID WHERE orders_distributor_ID = '$dashID' AND orders_process_status != '2' ORDER BY orders_mgmt.om_timestamp DESC"
好的,从您告诉我的所有内容来看,这就是我完成的内容:
SELECT
o.id
, GROUP_CONCAT( DISTINCT om.status ORDER BY om.status ASC SEPARATOR ',' ) status
FROM orders o
INNER JOIN orders_mgmt om
ON om.order_id = o.id
GROUP BY o.id
我对您的表做了一些更改,以使其更易于使用,请检查小提琴: http ://sqlfiddle.com/#!2/ 8a9f8/8
我所做的:
我将状态复选框存储为表格中的一行(请检查orders_mgmt表中的第3、4和5行),如果它们标记了3个复选框,则将存储3行。 这样,您只需将DISTINCT与GROUP BY子句一起使用就可以了。 如果您想拥有一个恢复表(我的意思是,一个特定的表仅在其他表中具有该值),以减少内部连接和查询的大小,从而减少负载,请注意,这将破坏关系DDBB的原理,但是有时是更好的选择),您可以触发以下命令:插入后将合并值并将其插入订单表的状态字段中
根据我的经验,我猜测您正在使用该表字段名称,因为您不知道别名sintaxis(至少,直到发现它们XD为止,我都做过同样的事情)。 将名称更改为短名称,然后使用别名引用它们(请参见我将orders_mgmt编写为om,然后将其与group by和select一起使用)。 另外,请勿混用大写和小写字母,始终将小写字母与下划线混合使用,以保持自己的标准。
最后,切勿在选择中使用*通配符,因为它们是魔鬼! 这可能会大大降低您的查询速度(在将字段名称更改为“ *”后,执行查询的时间减少了十倍)。
好吧,希望这会帮助您实现所需的XD。 我知道我做了很多与代码审查有关的事情,但我无能为力,XD
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.