1

正しいレコードを取得しようとしていますが、理由により、Having 句に問題があると思います。誰か助けてもらえますか?

ケース 1: order_id = 1 (新規注文) の行を選択しようとしているが、同じ注文 ID を持つ複数のレコードが存在してはならない

ケース 2: order_id = 2 (印刷された注文) の行を選択しますが、新しい注文も選択してケース 1 を適用する必要があります。同じオーダー ID を持つ 1 つのレコードより)

order_id
= 注文の ID
status_id = 異なるステータス ID 例: 1 = 新規、2 = 印刷済み、3 = 処理中など...
status_change_by = 注文ステータスを新規から印刷済みに変更した管理者の ID処理...

order_id | status_id | status_change_by
1        | 1         | (NULL)
1        | 2         | 12
1        | 3         | 12
2        | 1         | (NULL)
3        | 1         | (NULL)
4        | 1         | (NULL)
1        | 4         | 13
5        | 1         | (NULL)
3        | 2         | (NULL)

これが私の単純な mySQL クエリです。

SELECT * from order_tracking
where status_id = 1
group by order_id
having count(order_id) <= 2;

参照用に SQL フィドルも作成しました。間違っているかどうか、または CASE または IF ステートメントを使用した複雑なクエリが必要かどうかを確認してください。

http://sqlfiddle.com/#!2/16936/3

このリンクが機能しない場合は、次のコードで作成してください:

CREATE TABLE order_tracking 
(
 track_id int auto_increment primary key, 
 order_id int (50), 
 status_id int(20), 
 status_changed_by varchar(30)
);

挿入は次のとおりです。

INSERT INTO order_tracking
(order_id, status_id, status_changed_by)
VALUES
(1,1,''),
(1,2,12),
(1,3,12),
(2,1,''),
(3,1,''),
(4,1,''),
(1,4,13),
(5,1,''),
(3,2,'');

あなたの早い応答は高く評価されるべきです! 時間をありがとう。

欲望の結果:

Case:1これは非常に単純で、結果は次のようになります: レコードが 1 つ以下の新規注文のみ

Order_id | status_id | status_changed_by
2        |  1        | (NULL)
4        |  1        | (NULL)
3        |  1        | (NULL)

ケース 2 の結果:

Order_id | status_id | status_changed_by
1        |  4(max id)| (NULL)
2        |  1        | (NULL)
4        |  1        | (NULL)
3        |  2(max id)| (NULL)
4

1 に答える 1

1

質問の行間を読むと、各注文IDのステータスの最高数値を表示したいようです。つまり、あなたの注文はステータス 1 から 2、3 へと進行しているように見えます。

その方法は次のとおりです。最初に、次のように、各注文の最高のステータスを決定します。

    SELECT MAX(status_id) AS status_id, 
           order_id
      FROM order_tracking
     GROUP BY order_id

このクエリは、ステータス ID の最大値を示す各 order_id に対して 1 つの行を提供します。

次に、それをサブクエリとして使用し、元のテーブルに結合します。 http://sqlfiddle.com/#!2/16936/11/0

SELECT o.order_id, o.status_id, o.status_changed_by
  FROM order_tracking AS o
  JOIN (
        SELECT MAX(status_id) AS status_id, 
               order_id
          FROM order_tracking
         GROUP BY order_id
       ) AS m ON o.order_id = m.order_id AND o.status_id = m.status_id
 ORDER BY o.order_id

これにより、各注文のステータスが最高の素晴らしい結果が得られます。

| ORDER_ID | STATUS_ID | STATUS_CHANGED_BY |
|----------|-----------|-------------------|
|        1 |         4 |                13 |
|        2 |         1 |                   |
|        3 |         2 |                   |
|        4 |         1 |                   |
|        5 |         1 |                   |

注意: テーブルに自動インクリメントID列を配置するorder_trackingと、うまくいく可能性があります。数値的に最高のステータスではなく、それぞれの最新のINSERTステータスを取得できます。order_id私の意見では、これはテーブル レイアウトに非常に役立つ変更になるでしょう。次のようにします。

SELECT o.order_id, o.status_id, o.status_changed_by
  FROM order_tracking AS o
  JOIN (
        SELECT MAX(id) AS id, 
               order_id
          FROM order_tracking
         GROUP BY order_id
       ) AS m ON o.id = m.id
 ORDER BY o.order_id
于 2014-10-09T00:41:50.323 に答える