1

MySQLデータベースに3つのテーブルがあります。

表1(と呼ばれるclient)にはクライアントの情報があります。client_id and client_name 表2(と呼ばれるuser_to_client)には、システムのユーザーを持つ各クライアントに関連する情報がありますuser_id, client_id and order_flag

このテーブルでは、クライアントとユーザーが繰り返されています。注文フラグは、ユーザーとクライアントのビジネスが未完了であることを示しています。user_idとclient_idの組み合わせは、そのテーブルで1回だけ見つけることができます。つまり、ユーザー5とクライアント3は1回だけ登録されます。

表3(と呼ばれるorders)は、注文の基本情報に関する情報を保持していますclient_id, user_id, order_id。2つの異なる日付タイプ列を保持します。注文の作成を開始した日付の情報を保持するdate_startedと、注文が操作領域に送信された日付を保持するdate_sentです。

2つの表で情報を繰り返す理由は、表3では、ユーザーとクライアントが大量の未完了の注文を持っている可能性があり、それらはもう利用できないためですが、会社の記録を保持する必要があります。

だから、私がする必要があるのは、クライアントを繰り返さずに、未完了の注文がある最後の4つのクライアントと、その最後の未完了の注文のIDを選択することです。基本的に、テーブル1からクライアント名を選択する必要があります。そのクライアントがテーブル2でorder_flagがアクティブになっている場合(値1)、テーブル3からそのユーザーに属する最新のorder_idを選択します。

テーブルはすでに別のジョブで使用されているため変更できません。そのため、誰かがMySQLクエリを使用してジョブを実行するのを手伝ってもらえますか?

4

1 に答える 1

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と日付に基づいて正しい順序を見つけることができると想定されます。これが当てはまらない場合、相関サブクエリは、適切なフィルタリング情報を取得するために他のテーブルを取り込む必要があります。

于 2012-08-27T14:42:13.067 に答える