繁体   English   中英

MySQL连接,最近,按组,每个id限制为1个结果

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM