首页 > 解决方案 > 使用 MySQL/MariaDB 比较具有排序和分组行的两个表

问题描述

我想比较两张表,一张是当前订单,另一张是所有订单的历史。

我的目的是查找当前订单是否已存在于历史记录中。为此,我需要验证它们是否具有相同 item的 ,以相同的 sequence 顺序(不关心确切的数字,只是顺序)对于任何订单number(将订单分组为块)。在此示例中,current_order存在于history_order.ordernumber中2

current_order
+----------+------+
| sequence | item |
+----------+------+
|        1 |   11 |
|        2 |   12 |
|        3 |   13 |
+----------+------+

history_orders
+--------+----------+------+
| number | sequence | item |
+--------+----------+------+
|      1 |        1 |   11 | <- matches item 11
|      1 |        2 |   12 | <- matches item 12
|      1 |        3 |   14 | <- does not match 13, order 1 does not match
+--------+----------+------+
|      2 |        4 |   11 | <- matches item 11
|      2 |        5 |   12 | <- matches item 12
|      2 |        6 |   13 | <- matches item 13, order 2 matches
+--------+----------+------+

我相信我需要创建两个子查询来获取订单items然后比较它们,但是如何处理订单number?它需要按块进行比较。我应该以某种方式遍历所有内容number吗?

(SELECT item FROM current_order ORDER BY sequence)
INNER JOIN
(SELECT item FROM history_orders ORDER BY sequence GROUP BY number)
...

先感谢您!

标签: mysql

解决方案


查找当前订单是否已存在于历史记录中。

一般来说,它可以是,例如,

SELECT EXISTS ( SELECT NULL
                FROM ( SELECT GROUP_CONCAT(item ORDER BY item) items
                       FROM current_order ) co
                JOIN ( SELECT GROUP_CONCAT(item ORDER BY item) items
                       FROM history_orders
                       GROUP BY number ) ho USING (items) 
              ) AS order_with_this_items_list_exists

推荐阅读