Mysql 筛选具有一个项目而不同时具有另一个项目的订单

Mysql 筛选具有一个项目而不同时具有另一个项目的订单,mysql,sql,Mysql,Sql,我有一个非常简单的一对多关系(表-订单-项目),其中一个订单可以有零个或多个项目 什么是最好的方式(SQL查询)来只过滤同时有item1(item_id=1)和没有item2(item_id=2)的订单 目前,我使用以下SQL查询: SELECT o.order_id FROM orders o JOIN items i ON i.order_id=o.order_id WHERE i.item_id=1 AND o.order_id NOT IN (SELECT o2.orde

我有一个非常简单的一对多关系(表-订单-项目),其中一个订单可以有零个或多个项目

什么是最好的方式(SQL查询)来只过滤同时有item1(item_id=1)和没有item2(item_id=2)的订单

目前,我使用以下SQL查询:

SELECT o.order_id
  FROM orders o
  JOIN items i ON i.order_id=o.order_id
 WHERE i.item_id=1
   AND o.order_id NOT IN (SELECT o2.order_id
                            FROM orders o2
                            JOIN items i2 ON i2.order_id=o2.order_id
                           WHERE i2.item_id=2)

不需要相关子查询,使用
HAVING
子句

这不包括存在项目id=2的所有订单id

SELECT o.order_id
FROM orders o
JOIN items i ON i.order_id=o.order_id
WHERE i.item_id=1
GROUP BY o.order_id
HAVING SUM(item_id = 2) = 0;
或者你也可以

SELECT o.order_id
FROM orders o
JOIN items i ON i.order_id=o.order_id
WHERE i.item_id=1
GROUP BY o.order_id
HAVING COUNT(DISTINCT item_id) = 1;

确保它只有
项\u id=1
。有几种方法可以做到这一点,具体取决于您想要做什么。

不需要相关子查询,请使用
HAVING
子句

这不包括存在项目id=2的所有订单id

SELECT o.order_id
FROM orders o
JOIN items i ON i.order_id=o.order_id
WHERE i.item_id=1
GROUP BY o.order_id
HAVING SUM(item_id = 2) = 0;
或者你也可以

SELECT o.order_id
FROM orders o
JOIN items i ON i.order_id=o.order_id
WHERE i.item_id=1
GROUP BY o.order_id
HAVING COUNT(DISTINCT item_id) = 1;

确保它只有
项\u id=1
。有几种方法可以做到这一点,具体取决于您想要做什么。

不需要相关子查询,请使用
HAVING
子句

这不包括存在项目id=2的所有订单id

SELECT o.order_id
FROM orders o
JOIN items i ON i.order_id=o.order_id
WHERE i.item_id=1
GROUP BY o.order_id
HAVING SUM(item_id = 2) = 0;
或者你也可以

SELECT o.order_id
FROM orders o
JOIN items i ON i.order_id=o.order_id
WHERE i.item_id=1
GROUP BY o.order_id
HAVING COUNT(DISTINCT item_id) = 1;

确保它只有
项\u id=1
。有几种方法可以做到这一点,具体取决于您想要做什么。

不需要相关子查询,请使用
HAVING
子句

这不包括存在项目id=2的所有订单id

SELECT o.order_id
FROM orders o
JOIN items i ON i.order_id=o.order_id
WHERE i.item_id=1
GROUP BY o.order_id
HAVING SUM(item_id = 2) = 0;
或者你也可以

SELECT o.order_id
FROM orders o
JOIN items i ON i.order_id=o.order_id
WHERE i.item_id=1
GROUP BY o.order_id
HAVING COUNT(DISTINCT item_id) = 1;

确保它只有
项\u id=1
。有几种方法,具体取决于你想做什么。

我更喜欢使用
分组方式和
拥有
来处理这些类型的问题:

SELECT i.order_id
FROM items i
GROUP BY i.order_id
HAVING SUM(i.item_id = 1) > 0 AND
       SUM(i.item_id = 2) = 0;
一些注意事项:

  • 您不需要加入
    订单
    ,因为您在
    项目中有
    订单id
  • having子句中的每个条件都在计算项目的数量。第一个表示至少有第1项中的一项,第二个表示没有第2项
  • 我删除了
    where
    子句。如果您有一个,那么它将是
    在(1,2)
    中的i.item\u id
编辑:

在MySQL以外的任何数据库中,您都可以使用以下
HAVING
子句:

HAVING SUM(CASE WHEN i.item_id = 1 THEN 1 ELSE 0 END) > 0 AND
       SUM(CASE WHEN i.item_id = 2 THEN 1 ELSE 0 END) = 0;

这在MySQL中也会起作用;我只喜欢较短的符号。

我更喜欢使用
分组方式和
拥有
来处理这些类型的问题:

SELECT i.order_id
FROM items i
GROUP BY i.order_id
HAVING SUM(i.item_id = 1) > 0 AND
       SUM(i.item_id = 2) = 0;
一些注意事项:

  • 您不需要加入
    订单
    ,因为您在
    项目中有
    订单id
  • having子句中的每个条件都在计算项目的数量。第一个表示至少有第1项中的一项,第二个表示没有第2项
  • 我删除了
    where
    子句。如果您有一个,那么它将是
    在(1,2)
    中的i.item\u id
编辑:

在MySQL以外的任何数据库中,您都可以使用以下
HAVING
子句:

HAVING SUM(CASE WHEN i.item_id = 1 THEN 1 ELSE 0 END) > 0 AND
       SUM(CASE WHEN i.item_id = 2 THEN 1 ELSE 0 END) = 0;

这在MySQL中也会起作用;我只喜欢较短的符号。

我更喜欢使用
分组方式和
拥有
来处理这些类型的问题:

SELECT i.order_id
FROM items i
GROUP BY i.order_id
HAVING SUM(i.item_id = 1) > 0 AND
       SUM(i.item_id = 2) = 0;
一些注意事项:

  • 您不需要加入
    订单
    ,因为您在
    项目中有
    订单id
  • having子句中的每个条件都在计算项目的数量。第一个表示至少有第1项中的一项,第二个表示没有第2项
  • 我删除了
    where
    子句。如果您有一个,那么它将是
    在(1,2)
    中的i.item\u id
编辑:

在MySQL以外的任何数据库中,您都可以使用以下
HAVING
子句:

HAVING SUM(CASE WHEN i.item_id = 1 THEN 1 ELSE 0 END) > 0 AND
       SUM(CASE WHEN i.item_id = 2 THEN 1 ELSE 0 END) = 0;

这在MySQL中也会起作用;我只喜欢较短的符号。

我更喜欢使用
分组方式和
拥有
来处理这些类型的问题:

SELECT i.order_id
FROM items i
GROUP BY i.order_id
HAVING SUM(i.item_id = 1) > 0 AND
       SUM(i.item_id = 2) = 0;
一些注意事项:

  • 您不需要加入
    订单
    ,因为您在
    项目中有
    订单id
  • having子句中的每个条件都在计算项目的数量。第一个表示至少有第1项中的一项,第二个表示没有第2项
  • 我删除了
    where
    子句。如果您有一个,那么它将是
    在(1,2)
    中的i.item\u id
编辑:

在MySQL以外的任何数据库中,您都可以使用以下
HAVING
子句:

HAVING SUM(CASE WHEN i.item_id = 1 THEN 1 ELSE 0 END) > 0 AND
       SUM(CASE WHEN i.item_id = 2 THEN 1 ELSE 0 END) = 0;

这在MySQL中也会起作用;我只喜欢较短的符号。

您能给我们展示一下表数据示例吗?您确定您总是只有itemid1和2吗?在某个时候,您会有更多这样的数据吗?您能给我们展示一下表数据示例吗?您确定您总是只有itemid1和itemid2吗?在某个时候,您会有更多这样的数据吗?您能给我们展示一下表数据示例吗?您确定您总是只有itemid1和itemid2吗?在某个时候,您会有更多这样的数据吗?您能给我们展示一下表数据示例吗?您确定您总是只有itemid1和itemid2吗?你会在某个时候有更多的这些吗?很好的记录和解释。然而,这种逻辑表达式SUM(i.item_id=1)求和的“技巧”对我来说是新的东西。很好,很好的注释和解释。然而,这种逻辑表达式SUM(i.item_id=1)求和的“技巧”对我来说是新的东西。很好,很好的注释和解释。然而,这种逻辑表达式SUM(i.item_id=1)求和的“技巧”对我来说是新的东西。很好,很好的注释和解释。然而,这种逻辑表达式SUM(i.item_id=1)求和的“技巧”对我来说是新的东西。好的。