MySQL加入,最近,group by,每个id限制为1个结果

时间:2014-06-12 17:05:59

标签: mysql join syntax

目前我正在开发一个系统设置,以允许公司及其各个部门查看订单的订单。我这样做是通过在订单管理表中存储逗号分隔的“状态”,这样我们就可以跟踪递归(员工在哪一天做了什么,等等)

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"

1 个答案:

答案 0 :(得分:0)

好的,从你告诉我的一切,这就是我完成的事情:

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