Mysql 筛选具有一个项目而不同时具有另一个项目的订单
我有一个非常简单的一对多关系(表-订单-项目),其中一个订单可以有零个或多个项目 什么是最好的方式(SQL查询)来只过滤同时有item1(item_id=1)和没有item2(item_id=2)的订单 目前,我使用以下SQL查询: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
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)求和的“技巧”对我来说是新的东西。好的。