SQL获取与我的条件匹配的行
我有一个简单的SQL表,它包含以下内容:SQL获取与我的条件匹配的行,sql,Sql,我有一个简单的SQL表,它包含以下内容: +---------------------+ | id | mode | value | +---------------------+ | 1 | EXCLUDE | 10 | | 2 | INCLUDE | 10 | | 3 | EXCLUDE | 10 | | 3 | EXCLUDE | 20 | +---------------------+ 想象一下这些都是产品。产品1具有除10以外的所有值。产品2的值仅为10。
+---------------------+
| id | mode | value |
+---------------------+
| 1 | EXCLUDE | 10 |
| 2 | INCLUDE | 10 |
| 3 | EXCLUDE | 10 |
| 3 | EXCLUDE | 20 |
+---------------------+
想象一下这些都是产品。产品1具有除10以外的所有值。产品2的值仅为10。产品3具有除10和20以外的所有值
我需要一个给定值的sql,我应该返回该值有效的所有产品
e、 g.值为10应返回产品2。值30应返回乘积1和3
我试过这个:
SELECT *
FROM products
WHERE ( mode = 'INCLUDE' AND value IN( 10) ) OR
( mode = 'EXCLUDE' AND value NOT IN ( 10 ) )
例如,对于值10,它还返回第4行,这是基于sql的预期值。我怎样才能修好它?我想根据id对排除项进行分组,并使用not exists()
使用不存在()
您的问题是
id
s在多行上。因此,考虑分组依据
,其中的条件为:
SELECT p.id
FROM products p
GROUP BY p.id
HAVING SUM(CASE WHEN mode = 'INCLUDE' and VALUE IN (10) THEN 1 ELSE 0 END) > 0 OR
(SUM(CASE WHEN mode = 'EXCLUDE' THEN 1 ELSE 0 END) > 0 AND -- has excludes
SUM(CASE WHEN mode = 'EXCLUDE' and VALUE IN (10) THEN 1 ELSE 0 END) = 0 -- but not this one
);
这是复杂的逻辑。我认为逻辑是:
- 如果任何
明确包含该值,则保留该idid
- 如果任何
明确排除该值,请删除该idid
- 如果任何行排除其他值,但不排除此值,请保留id
- 您的问题是
id
s在多行上。因此,考虑分组依据
,其中的条件为:
SELECT p.id
FROM products p
GROUP BY p.id
HAVING SUM(CASE WHEN mode = 'INCLUDE' and VALUE IN (10) THEN 1 ELSE 0 END) > 0 OR
(SUM(CASE WHEN mode = 'EXCLUDE' THEN 1 ELSE 0 END) > 0 AND -- has excludes
SUM(CASE WHEN mode = 'EXCLUDE' and VALUE IN (10) THEN 1 ELSE 0 END) = 0 -- but not this one
);
这是复杂的逻辑。我认为逻辑是:
- 如果任何
明确包含该值,则保留该idid
- 如果任何
明确排除该值,请删除该idid
- 如果任何行排除其他值,但不排除此值,请保留id
value=30时,这将返回1,2,3
而不是1,3
,当value=30
SELECT DISTINCT
p.id
FROM
products p
WHERE
EXISTS ( SELECT 1 FROM products WHERE id = p.id AND value = 10 AND mode = 'INCLUDE' )
OR
NOT EXISTS ( SELECT 1 FROM products WHERE id = p.id AND value = 10 AND mode = 'EXCLUDE')