mysql 如何在至少一个where条件为true时排除列值?

g6ll5ycj  于 2023-10-15  发布在  Mysql
关注(0)|答案(1)|浏览(101)

类别_销售

| 类别id|客户ID|销售|
| --|--|--|
| 203 | 1 | 2325 |
| 15 | 2 | 847 |

品牌_销售

| 品牌标识|客户ID|销售|
| --|--|--|
| 108 | 1 | 2001 |
| 20 | 2 | 89 |

product_sales

| 产品ID|客户ID|销售|
| --|--|--|
| 112 | 1 | 1900 |
| 12 | 1 | 150 |
| 124 | 2 | 1091 |

SELECT id
FROM customers
WHERE
id IN (SELECT customer_id FROM category_sales WHERE category_id IN (...))
AND id NOT IN (SELECT customer_id FROM brand_sales WHERE brand_id IN (...))
AND id NOT IN (SELECT customer_id FROM product_sales WHERE product_id IN (...))

我正在尝试获取购买或未购买某些品牌、产品和类别的客户ID列表。上面的查询没有按预期工作,因为结果列表中仍然有购买了某些品牌或产品的客户,这些客户本应被查询过滤掉。
我第一次尝试加入三个销售表与客户表-没有工作。然后我尝试使用EXISTS和NOT EXISTS来代替普通的WHERE条件-不起作用。还尝试使用OR而不是AND-不起作用。我错过了什么?
我使用的mysql版本是5.7.12,因此不能使用CTE。

nzk0hqpo

nzk0hqpo1#

我不确定这个说法
我正在尝试获取购买或未购买某些品牌、产品和类别的客户ID列表。
但是,我假设你想得到列出的客户ID列表,但没有购买某些品牌,产品和类别。
有了以上的假设,你在查询中的错误只出现在第一个条件上。您的查询应该是这样的:

SELECT id
FROM customers
WHERE
id NOT IN (SELECT customer_id FROM category_sales WHERE category_id IN (...))
AND id NOT IN (SELECT customer_id FROM brand_sales WHERE brand_id IN (...))
AND id NOT IN (SELECT customer_id FROM product_sales WHERE product_id IN (...))

为了使它更具可读性,我将使用LEFT JOIN对其进行更改。下面是示例代码:

SELECT c.id
FROM customers c
LEFT JOIN category_sales cat ON c.id = cat.customer_id AND cat.category_id IN (...)
LEFT JOIN brand_sales brand ON c.id = brand.customer_id AND brand.brand_id IN (...)
LEFT JOIN product_sales prod ON c.id = prod.customer_id AND prod.product_id IN (...)
WHERE cat.customer_id IS NULL AND brand.customer_id IS NULL AND prod.customer_id IS NULL;

相关问题