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