2016-08-23 23 views
0

私はPrestashopを使用しており、各注文の現在の状態と登録された最後の注文履歴状態を比較するデータの整合性を確認する必要があります。注文履歴と最後の注文状態の不一致のフィルタ注文

注文表:

╔══════════╦═══════════════╦ 
║ id_order ║ current_state ║ 
╠══════════╬═══════════════╬ 
║ 1  ║  3  ║ 
║ 2  ║  1  ║ 
║ 3  ║  2  ║ 
║ 4  ║  1  ║ 
╚══════════╩═══════════════╩ 

order_history表:

╔══════════════════╦══════════╦════════════════╦═════════════════════╦ 
║ id_order_history ║ id_order ║ id_order_state ║  date_add  ║ 
╠══════════════════╬══════════╬════════════════╬═════════════════════╬ 
║  1   ║  1 ║  1  ║ 2016-08-01 11:00:00 ║ 
║  2   ║  2 ║  1  ║ 2016-08-02 12:00:00 ║ 
║  3   ║  1 ║  3  ║ 2016-08-03 13:00:00 ║ 
║  4   ║  3 ║  1  ║ 2016-08-04 14:00:00 ║ 
║  5   ║  3 ║  2  ║ 2016-08-05 15:00:00 ║ 
║  6   ║  2 ║  3  ║ 2016-08-06 16:00:00 ║ 
║  7   ║  4 ║  1  ║ 2016-08-07 17:00:00 ║ 
╚══════════════════╩══════════╩════════════════╩═════════════════════╩ 

(自発的逃したテーブルは、注文の状態の名前を与えることである:1 = "有料"、 2 =「確認」、3 =「出荷」...)

通常、current_stateの順序は(私のサンプルでは、​​注文番号2、current_state = 1であるが、最後の履歴更新のid_order_stateは2である)、そして私が明らかにしたいことである。

私は、各ラストオーダー状態更新取得するには、この操作を行います。

SELECT o.id_order, o.current_state, h.id_order_state, max(h.date_add) 
FROM orders o, order_history h 
WHERE o.id_order = h.id_order 
GROUP BY o.id_order, o.current_state, h.id_order_state 
ORDER BY o.id_order ASC 

しかし、まず、私は、各オーダーの最後の更新の状態のみをしたいので、それは十分ではありません。

╔══════════╦═══════════════╦════════════════╦═════════════════════╗ 
║ id_order ║ current_state ║ id_order_state ║ max(h.date_add) ║ 
╠══════════╬═══════════════╬════════════════╬═════════════════════╣ 
║ 1  ║  3  ║  3  ║ 2016-08-03 13:00:00 ║ 
║ 2  ║  1  ║  3  ║ 2016-08-06 16:00:00 ║ 
║ 3  ║  2  ║  2  ║ 2016-08-05 15:00:00 ║ 
║ 4  ║  1  ║  1  ║ 2016-08-07 17:00:00 ║ 
╚══════════╩═══════════════╩════════════════╩═════════════════════╝ 

をと第2に、WHERE current_state <> id_order_stateのフィルタを追加して、破損したデータのみを表示します(注文番号2など)。

╔══════════╦═══════════════╦════════════════╦═════════════════════╗ 
║ id_order ║ current_state ║ id_order_state ║ max(h.date_add) ║ 
╠══════════╬═══════════════╬════════════════╬═════════════════════╣ 
║ 2  ║  1  ║  3  ║ 2016-08-06 16:00:00 ║ 
╚══════════╩═══════════════╩════════════════╩═════════════════════╝ 

完全なSQL要求でこれが可能ですか?

+0

私はあなたの質問が何であるか不明です。あなたは2つの非常に異なることが必要なようです。 –

+0

prestashopのどのバージョンですか? – sarcom

+0

@ GordonLinoff:「2番目の」出力を得るためのSQLリクエストを探していますが、プロセスロジックで最も正確であると「最初に」言及しました。 – Klemart3D

答えて

1

例:

SELECT o.id_order 
    , o.current_state 
    , x.id_order_state 
    , x.date_add 
    FROM order_history x 
    JOIN 
    (SELECT id_order,MAX(date_add) date_add FROM order_history GROUP BY id_order) y 
    ON y.id_order = x.id_order 
    AND y.date_add = x.date_add 
    JOIN orders o 
    ON o.id_order = x.id_order 
WHERE x.id_order_state <> o.current_state; 
+0

ありがとう@Strawberry !!それは非常にうまく動作します:)このクエリは私に "checkedFrom"エラーを与えるため、下位のサブクエリはPrestashopの1.6.0.14 Admin Request SQL内で動作していないようです。しかし、PS 1.6.1.5でテストしたところ、うまくいきました! – Klemart3D

0

最初にmax(h.date_add)句を使用して、注文履歴を一時テーブルに選択します。

あなたは、一時テーブル(または副問合せ)にそれを置くことによって、あなたのクエリWHERE o.id_order = h.id_order

を使用してこれに参加することができまず、あなたは複数行の問題を解消しています。次に、どの状態が同期していないかを示す順序状態について比較を行うことができます。

まず、履歴テーブルから不要なデータを事前フィルタリングすると考えてください。

0

Klemart3Dこれは、基本的なSQLクエリではありません:) 申し訳ありませんが、私はタイトルが別のユーザー:)によって編集されたことがわかりませんでした、しかし、私は推測する(と私は願っていますXD)それは何が必要ないクエリです:

SELECT 
    o.`id_order`, o.`current_state`, h.`id_order_state`, h.`date_add` 
FROM 
    `ps_order_history` h INNER JOIN (SELECT `id_order`, MAX(`date_add`) AS maxdateadd FROM `ps_order_history` GROUP BY id_order) laststatus ON (h.`id_order` = laststatus.`id_order` AND h.`date_add` = laststatus.`maxdateadd`) 
    INNER JOIN `ps_orders` o ON (o.`id_order` = h.`id_order` AND o.`current_state` <> h.`id_order_state`) 
ORDER BY h.`id_order` ASC 

私は、テーブル名に標準の接頭辞psを追加しました。

0

私はこの回避策を見つけましたが、ここに掲載いくつかの他のクエリは私よりも優れている:

SELECT o.id_order, o.current_state, h.id_order_state, h.date 
FROM ps_orders o 
LEFT JOIN (
    SELECT id_order, id_order_state, max(date_add) as date 
    FROM ps_order_history 
    GROUP BY id_order 
    ORDER BY id_order DESC 
) h ON o.id_order = h.id_order 
WHERE o.current_state <> h.id_order_state 
GROUP BY o.id_order 
ORDER BY o.id_order DESC 

私は、テーブル名に標準の接頭辞psを追加しました。

注:このクエリはPrestashopのRequest SQLでは機能しません(このサブクエリはPS v1.6.0.14で "未定義のcheckedFromエラー"を生成します)。

関連する問題