【问题标题】:MySQL 如何选择包含一组产品类型的订单
【发布时间】:2025-12-24 17:20:23
【问题描述】:

我在下面有 4 张桌子:

订单

id items_quantity
1 3
2 4
3 4

项目

id order_id product_id
1 1 1
2 1 3
3 1 2
4 2 1
5 2 4
6 3 4

餐桌用品

id product_type_id name
1 1 Red Bull
2 2 Dairy Pure
3 3 Aquafina
4 4 M&M's

表 product_types

id name
1 Beverage
2 Milk
3 Water
4 Food

我无法找到解决方案来获取包含饮料商品的所有订单。这些订单可以包含牛奶和水,但不包含食品。预期结果将是 id 为 1 的订单。 我已尝试过此查询,但我仍然收到包含食品的订单。

SELECT "orders".* FROM "orders"
INNER JOIN "items" ON "items"."order_id" = "orders"."id"
INNER JOIN "products" ON "products"."id" = "items"."product_id"
INNER JOIN "product_types" ON "product_types"."id" = "products"."product_type_id"
WHERE (product_types.name != 'Food')
GROUP BY product_types.name, orders.id HAVING (product_types.name = 'Beverage')

【问题讨论】:

  • 更新您的问题,添加适当的数据样本和预期结果作为表格文本
  • HAVING SUM(product_types.name = 'Beverage')
  • 在 MySQL 中,你应该使用反引号而不是引号,或者在不使用保留字的地方什么也不用

标签: mysql sql


【解决方案1】:

尝试显式过滤您希望在查询中出现的 product_types 以实现 id=1 包含饮料项目:

SELECT `orders`.* FROM `orders`
INNER JOIN `items` ON `items`.`order_id` = `orders`.`id`
INNER JOIN `products` ON `products`.`id` = `items`.`product_id`
INNER JOIN `product_types` ON `product_types`.`id` = `products`.`product_type_id`
WHERE `product_types`.`name` != 'Food'
AND `product_types`.`name` = 'Beverage'
GROUP BY `product_types`.`name`;

输出:

+----+----------------+
| id | items_quantity |
+----+----------------+
| 1  | 3              |
+----+----------------+
1 row in set (0.04 sec)

【讨论】:

    最近更新 更多