Chr*_*ris 4 sql postgresql filter
我在SQL中有两个表,一个有项目,另一个有项目所属的类,即JOIN看起来大致如下:
Project | Category
--------+---------
Foo | Apple
Foo | Banana
Foo | Carrot
Bar | Apple
Bar | Carrot
Qux | Apple
Qux | Banana
Run Code Online (Sandbox Code Playgroud)
(显然,字符串替换为更高正常形式的ID,但你明白了这一点.)
我想要做的是允许过滤,以便用户可以选择任意数量的类别,结果将被过滤到属于所有选定类别的成员的项目.例如,如果用户选择类别"Apple"和"Banana",则显示项目"Foo"和"Qux".如果用户选择类别"Apple","Banana"和"Carrot",则只显示"Foo"项目.
我尝试的第一件事是一个简单的SELECT DISTINCT项目FROM ... WHERE Category ='Apple'和Category ='Banana',但当然这不起作用,因为Apple和Banana在两个不同的行中显示在同一列中对于任何共同的项目.
GROUP BY和HAVING对我没有任何好处,所以告诉我:有没有一种明显的方法可以做到这一点,我错过了,或者它是否真的如此复杂以至于我不得不求助于递归连接?
顺便说一句,这是在PostgreSQL中,但当然,标准SQL代码在可能的情况下总是更好.
有关性能详情,请参阅我的博客中的这篇文章
解决方案如下:
适用于任何类别
为更高效,COUNT并且GROUP BY,因为它会检查任何项目/类别对存在恰好一次,不计数.
SELECT *
FROM (
SELECT DISTINCT Project
FROM mytable
) mo
WHERE NOT EXISTS
(
SELECT NULL
FROM (
SELECT 'Apple' AS Category
UNION ALL
SELECT 'Banana'
UNION ALL
SELECT 'Carrot'
) list
WHERE NOT EXISTS
(
SELECT NULL
FROM mytable mii
WHERE mii.Project = mo.Project
AND mii.Category = list.Category
)
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13849 次 |
| 最近记录: |