SQL筛选同一列中的多个项目

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代码在可能的情况下总是更好.

Qua*_*noi 7

有关性能详情,请参阅我的博客中的这篇文章


解决方案如下:

  • 适用于任何类别

  • 为更高效,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)