2016-08-23 109 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 ║ 
╚══════════╩═══════════════╩════════════════╩═════════════════════╝ 

而且然后添加一个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

我不清楚你的问题是什么。你似乎想要两个完全不同的东西。 –

+0

哪个版本的prestashop? – sarcom

+0

@ GordonLinoff:我正在寻找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!它工作得很好:)只有缺点,子查询似乎不适用于Prestashop的1.6.0.14 Admin Request SQL,因为这个查询给我一个“checkedFrom”错误。但我在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的请求SQL(子查询与PS v1.6.0.14生成“Undefined checkedFrom错误”)。