MySQL:一对多组合

时间:2018-08-31 08:40:10

标签: mysql

下面是表格数据(Order_audit)

+------------+-----------------+
|   OrderID  |  shipping_type  |
+------------+-----------------+
|   W1       |   0             |
|   W1       |   2             |
|   W2       |   2             |
|   W3       |   2             |
|   W3       |   2             |
|   W3       |   1             |
|   W4       |   0             |
|   W5       |   1             |
|   W5       |   2             |
+------------+-----------------+

我希望sql提取具有(0或1)和2组合的shipping_type的orderID。在此示例中,W1,W3,W5是符合此条件的订单。 假设表名称为order_audit。

请帮助我。

2 个答案:

答案 0 :(得分:1)

我们可以尝试通过OrderID进行汇总,然后在每个订单组中声明以下两个条件:

  • 存在两个(并且只有两个)不同的shipping_type
  • 这些shipping_type值之一是2

如果以上两个条件均成立,则意味着该订单具有(0, 2)(1, 2)作为运输组合。

SELECT OrderID
FROM yourTable
WHERE shipping_type IN (0, 1, 2)
GROUP BY OrderID
HAVING
    COUNT(DISTINCT shipping_type) = 2 AND
    MAX(CASE WHEN shipping_type = 2 THEN 1 ELSE 0 END) = 1;

Demo

答案 1 :(得分:1)

使用此查询的一种方法是查询所有shipping_type为0或1且匹配条目为shipping_type为2的订单。

SELECT OrderID
FROM order_audit a1
WHERE shipping_type IN(0,1) AND
    EXISTS (SELECT *
            FROM order_audit a2
            WHERE a2.OrderID = a1.OrderID AND shipping_type = 2)

Demo