复杂从MySQL中的3列中选择

时间:2012-08-27 13:25:37

标签: mysql select inner-join

我在MySQL数据库中有3个表。

表1(比如称为client)包含客户信息:client_id and client_name 表2(比如称为user_to_client)包含与我的系统用户的每个客户端相关的信息:user_id, client_id and order_flag

在此表中重复客户端和用户,order flag表示用户和客户端有未完成的业务。 user_id和client_id的组合只能在该表中找到一次,这意味着用户5和客户端3只能注册一次。

表3(称为orders)保存有关订单基本信息的信息:client_id, user_id, order_id。它保留两个不同的日期类型列:date_started,用于保存开始构建订单时的日期信息; date_sent,用于保存订单发送到操作区域的日期。

我在两个表中重复信息的原因是因为在表3中,用户和客户可能有大量未完成的订单,这些订单已不再可用,但我需要保留公司记录。

所以,我需要做的是选择最后4个未完成订单的客户端而不重复客户端,并将id指向最后一个未完成的订单。基本上我需要从表1中选择客户端名称,如果该客户端在表2中具有order_flag激活(值1),则从表3中选择属于该用户的最新order_id。

我无法修改表格,因为它们已经被用于其他工作,所以,有人可以帮我处理MySQL查询来完成工作吗?

1 个答案:

答案 0 :(得分:2)

以下查询不会查询回答您的问题,因为客户端可以重复。但是,它为确定要做什么提供了良好的基础:

select c.*, o.*
from client c join
     user_to_client uc
     on c.client_id = uc.client_id join
     orders o
     on o.client_id = uc.client_id and
        o.user_id = uc.user_id
where uc.order_flag = 1 and
      o.date_sent is null  -- does this make an order "unfinished"?
order by date_started desc
limit 4

我不确定你是如何找到“未完成的”订单的。所以,我猜它是基于date_sent为NULL。

你真正需要的是更复杂一点。您想要每个客户的最新“未完成”订单。以下查询使用相关子查询来获取此信息:

select client_id, maxdate,
       (select max(order_id)
        from orders o
        where o.client_id = c.client_id and o.date_sent is null and o.date_started = c.maxdate) as orderid
from (select c.client_id, MAX(date_started) as maxdate
      from client c join
           user_to_client uc
           on c.client_id = uc.client_id join
           orders o
           on o.client_id = uc.client_id and
              o.user_id = uc.user_id
      where uc.order_flag = 1 and
            o.date_sent is null
      group by c.client_id
      order by 2 desc
      limit 4
     ) c

这假设它可以根据客户端ID和日期找到正确的顺序。如果不是这样,则相关子查询必须引入其他表以获取正确的过滤信息。