仅获取具有5个表的最大值的行

时间:2016-02-17 17:13:11

标签: mysql sql

我有这个问题:

SELECT work_orders.id,work_orders.create_datetime,work_orders.location,
       work_orders.description,user_accounts.function as function,
       user_accounts.name as username,work_order_states.name as state,
       work_orders_history.state_id,max(work_order_states.id)
FROM `work_orders`
LEFT JOIN work_orders_history 
    on work_orders.id = work_orders_history.work_order_id
LEFT JOIN user_accounts 
    on work_orders.create_user_id = user_accounts.id
LEFT JOIN work_order_type 
    on work_orders_history.type_id = work_order_type.id
LEFT JOIN work_order_states 
    on work_orders_history.state_id = work_order_states.id

......结果如下: enter image description here

但我想要的只是获得最大state_id的行。

我已经尝试了各种查询,但这是我能得到的最佳结果。

编辑:由于它超过65k的结果,很难提供一个小提琴。理想的结果就像这个图像: enter image description here

提前致谢。

2 个答案:

答案 0 :(得分:1)

您的查询中似乎非常接近。您需要添加GROUP BY并删除其中一个选择列。

SELECT work_orders.id,work_orders.create_datetime,work_orders.location,
       work_orders.description,user_accounts.[function] as [function],
       user_accounts.name as username,work_order_states.name as state,
       max(work_order_states.id)
FROM `work_orders`
LEFT JOIN work_orders_history 
    on work_orders.id = work_orders_history.work_order_id
LEFT JOIN user_accounts 
    on work_orders.create_user_id = user_accounts.id
LEFT JOIN work_order_type 
    on work_orders_history.type_id = work_order_type.id
LEFT JOIN work_order_states 
    on work_orders_history.state_id = work_order_states.id

GROUP BY work_orders.id,work_orders.create_datetime,work_orders.location,
       work_orders.description,user_accounts.function,
       user_accounts.name,work_order_states.name
HAVING work_orders_states.ID = (SELECT MAX(state_id) FROM work_orders_history)

答案 1 :(得分:0)

我认为你要找的是HAVING和GROUP BY子句的组合......

SELECT work_orders.id,work_orders.create_datetime,work_orders.location,
       work_orders.description,user_accounts.function as function,
       user_accounts.name as username,work_order_states.name as state,
       work_orders_history.state_id,max(work_order_states.id)
FROM `work_orders`
LEFT JOIN work_orders_history 
    on work_orders.id = work_orders_history.work_order_id
LEFT JOIN user_accounts 
    on work_orders.create_user_id = user_accounts.id
LEFT JOIN work_order_type 
    on work_orders_history.type_id = work_order_type.id
LEFT JOIN work_order_states 
    on work_orders_history.state_id = work_order_states.id

GROUP BY work_orders.id,work_orders.create_datetime,work_orders.location,
       work_orders.description,user_accounts.function,
       user_accounts.name,work_order_states.name,
       work_orders_history.state_id

HAVING work_orders_history.state_id=max(work_order_states.id)