当前位置: 首页 > 知识库问答 >
问题:

带左联接的SQL中复杂和嵌套的WHERE条件

王君墨
2023-03-14

我正在尝试用多个过滤器获取帖子,我的数据库如下所示,

  SELECT p.id, p.title
        FROM posts p
        JOIN meta m ON p.id = m.object_id
        WHERE m.object_name='post'

        AND (m.meta_key, m.meta_value) IN (('location', 'new city'),('post_type', 'section'))
        GROUP BY p.id, p.title
        HAVING COUNT(DISTINCT m.id) = 2

我尝试了上面的SQL,它可以工作,但问题是,如果我嵌套了两个以上的或条件和不同数量的过滤器,我会得到错误的结果。

just for explaining what i want , not sql :

            SELECT p.id, p.title
            FROM posts p
            JOIN meta m ON p.id = m.object_id
            WHERE m.object_name='post'
            AND
                                 (
                                    #SET 1 = (
                                       (m.meta_key = 'location' and m.meta_value = 'new city')
                                       or (m.meta_key = 'price' and m.meta_value = 100)
                                       or (m.meta_key = 'color' and m.meta_value = red)
                                    )

                                      OR

                                    #SET 2 = (
                                       m.meta_key = 'post_type' and m.meta_value = 'product'
                                       OR m.meta_key = 'location' and m.meta_value =  'delhi'
                                    )

                                 )
                          AND p.post_class='post'
              GROUP BY p.id, p.title
              HAVING if #SET 1 matched { COUNT(DISTINCT m.id) = 3 } elseIf #SET 2 matched { 
              COUNT(DISTINCT m.id) = 2 }

共有1个答案

赵夕
2023-03-14

您必须在having子句中分别检查每个条件。假设键不重复,您可以省去distinct并使用:

having sum( meta_key in ('location', 'price', 'color') ) = 3 or
       sum( meta_key in ('post_type', 'location') ) = 2

注意:您可以为此使用count(distinc),但我认为没有必要。

 类似资料:
  • 我将两个表上的连接定义为左外部连接,以便所有记录都从左表返回,即使它们在右表中没有记录。不过,我还需要包含一个where子句,但是...即使不满足where子句中的条件,我仍然希望为左侧表中的每个记录返回左侧表中的一行。有办法做到这一点吗? 我正在编写带有联接条件的查询,如下所示 以上条件不返回任何行。其中如下条件返回... 输出应为

  • 什么是 Nutz.Dao 中的复杂SQL条件 对于 Nutz.Dao 来说,它本质上就是将你的 Java 对象转化成 SQL,然后交给 JDBC 去执行。 而 SQL 中,当执行数据删除和查询操作时,最常用的就是 WHERE 关键字。 WHERE 关键字后面的就是所谓的复杂查询条件 Nutz.Dao 将如何如何使用这个条件 Dao 接口的 clear 方法和 query 方法的第二个参数,就是为了

  • 问题内容: 我在基于放置过滤条件的位置的查询中基于过滤条件得到不同的结果。我的问题是: 这些查询之间在技术上有区别吗? SQL标准中是否有任何内容可以解释与查询不同的记录集? 在简化的情况下: 我以为查询将返回相同的结果集,而当它们没有返回时,我感到很惊讶。我使用的是MS SQL2005,在实际查询中,查询1返回了约700行,查询2返回了约1100行,但我无法检测到返回行和排除行的模式。查询1中仍

  • 问题内容: 我的问题涉及到如何处理AngularJS应用程序中模板的复杂嵌套(也称为partials)。 如您所见,这有可能成为具有许多嵌套模型的相当复杂的应用程序。 该应用程序是单页的,因此它将加载index.html,该索引包含DOM中具有ng-view属性的div元素。 对于第1圈,您看到有一个主导航将相应的模板加载到中ng-view。我通过传递$routeParams给主应用程序模块来实现

  • 我对Kafka的溪流很陌生。我想执行以下KStream-GlobalKTable纯基于DSL的左联接操作,而不使用map操作。 和另一个输入主题,它是 ,其中value: 我要执行左联接操作是一个流,主数据是一个全局表,以实现结果值为 连接条件为 代码:

  • 问题内容: 我正在尝试使用PostgreSQL 9.2中添加的功能将查询结果映射到JSON 。 我在找出将连接的行表示为嵌套对象(1:1关系)的最佳方式时遇到麻烦 这是我尝试过的内容(设置代码:表格,示例数据,后跟查询): 查询本身: 我发现如果使用,我可以将结果字段分离为一个子对象,但似乎仅限于一个级别。我不能插入更多的语句,因为我认为在这种情况下我需要。 为我提供了列名,因为在该表的结果中,我