Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过三表内部联接中的多个AND子句匹配多行的SQL查询_Sql_Postgresql - Fatal编程技术网

通过三表内部联接中的多个AND子句匹配多行的SQL查询

通过三表内部联接中的多个AND子句匹配多行的SQL查询,sql,postgresql,Sql,Postgresql,对不起,如果我的标题不是很具体。我只是不知道这叫什么,因为我倾向于让Rails为我抽象DB查询,所以我不知道更复杂的查询。我有一个rails生成的查询: SELECT "stocks".* FROM "stocks" INNER JOIN "parts" ON "parts"."id" = "stocks"."part_id" INNER JOIN "features" ON "features"."part_id" = "parts"."id" INNER JOIN "feature_tit

对不起,如果我的标题不是很具体。我只是不知道这叫什么,因为我倾向于让Rails为我抽象DB查询,所以我不知道更复杂的查询。我有一个rails生成的查询:

SELECT "stocks".* FROM "stocks" INNER JOIN "parts" ON "parts"."id" = "stocks"."part_id" 
INNER JOIN "features" ON "features"."part_id" = "parts"."id" INNER JOIN "feature_titles" ON "feature_titles"."id" = "features"."feature_title_id" 
WHERE "parts"."category_id" = 20 AND "stocks"."manufacturer_id" = 4 
AND ((feature_titles.title = 'Title One' AND (features.value = '0.1' OR features.value = '1')) AND (feature_titles.title = 'Title Two' AND (features.value = '200')))
重要的是:

零件(id、编号、类别\u id)

features(id、value、feature\u title\u id、part\u id)

feature\u标题(id,title)

快速解释:


每个零件都可以有多个特征。每个要素都属于一个要素标题。现在我需要我的查询来获取所有具有与其各自的功能标题相关联的功能的零件。使用上述示例:

parts
---------
id number

1   some part number
2   some other part



执行下面的查询是可行的

SELECT "stocks".* FROM "stocks" INNER JOIN "parts" ON "parts"."id" = "stocks"."part_id" 
INNER JOIN "features" ON "features"."part_id" = "parts"."id" INNER JOIN "feature_titles" ON "feature_titles"."id" = "features"."feature_title_id" 
WHERE "parts"."category_id" = 20 AND "stocks"."manufacturer_id" = 4 
AND ((feature_titles.title = 'Title One' AND (features.value = '0.1' OR features.value = '1')))
它返回id为
1的零件。但是,如果我想通过添加另一个带有和功能的功能(请参见第一个问题查询)标题来进一步过滤,它将返回0行。我希望它返回相同的单行(在本例中)。我真的不明白,因为我认为AND或OR运算符就是这样工作的。除非我错过了什么

编辑:

对不起,伙计们,为了更清楚,我添加了另一个例子。忽略连接,因为where似乎是键:

feature_titles.title = 'Title One' AND 
    (features.value = '0.1' OR features.value = '1')
应返回id为1和2的零件。但问题是

(feature_titles.title = 'Title One' AND (features.value = '0.1')) 
    AND (feature_titles = 'Title Two' AND (features.value = '7 MAX'))

应该只返回id为2的部件。

我认为您需要一个聚合:

SELECT s.*
FROM "stocks" s INNER JOIN
     "parts" p
     ON p."id" = s."part_id" INNER JOIN
     "features" f
     ON f."part_id" = p."id" INNER JOIN
     "feature_titles" ft
     ON ft."id" = f."feature_title_id" 
WHERE p."category_id" = 20 AND s."manufacturer_id" = 4 AND
      ft.title = 'Title One' AND
      (f.value = '0.1' OR f.value = '1')
GROUP BY s.stock_id  -- may need to include all columns here
HAVING COUNT(DISTINCT f.value) = 2;  -- makes sure you get both of them

我认为您需要一个聚合:

SELECT s.*
FROM "stocks" s INNER JOIN
     "parts" p
     ON p."id" = s."part_id" INNER JOIN
     "features" f
     ON f."part_id" = p."id" INNER JOIN
     "feature_titles" ft
     ON ft."id" = f."feature_title_id" 
WHERE p."category_id" = 20 AND s."manufacturer_id" = 4 AND
      ft.title = 'Title One' AND
      (f.value = '0.1' OR f.value = '1')
GROUP BY s.stock_id  -- may need to include all columns here
HAVING COUNT(DISTINCT f.value) = 2;  -- makes sure you get both of them

我认为您需要一个聚合:

SELECT s.*
FROM "stocks" s INNER JOIN
     "parts" p
     ON p."id" = s."part_id" INNER JOIN
     "features" f
     ON f."part_id" = p."id" INNER JOIN
     "feature_titles" ft
     ON ft."id" = f."feature_title_id" 
WHERE p."category_id" = 20 AND s."manufacturer_id" = 4 AND
      ft.title = 'Title One' AND
      (f.value = '0.1' OR f.value = '1')
GROUP BY s.stock_id  -- may need to include all columns here
HAVING COUNT(DISTINCT f.value) = 2;  -- makes sure you get both of them

我认为您需要一个聚合:

SELECT s.*
FROM "stocks" s INNER JOIN
     "parts" p
     ON p."id" = s."part_id" INNER JOIN
     "features" f
     ON f."part_id" = p."id" INNER JOIN
     "feature_titles" ft
     ON ft."id" = f."feature_title_id" 
WHERE p."category_id" = 20 AND s."manufacturer_id" = 4 AND
      ft.title = 'Title One' AND
      (f.value = '0.1' OR f.value = '1')
GROUP BY s.stock_id  -- may need to include all columns here
HAVING COUNT(DISTINCT f.value) = 2;  -- makes sure you get both of them

我真的看不出所有嵌套的paren都有什么意义。我去掉了引号,因为它们有点分散我的注意力

WHERE
        parts.category_id = 20 AND stocks.manufacturer_id = 4 
    AND (
            feature_titles.title = 'Title One' AND features.value IN ('0.1', '1')
        OR  feature_titles.title = 'Title Two' AND features.value = '200'
    )
查看示例数据和查询,我不知道
'200'
值从何而来。我想知道你是不是也有这样的想法

WHERE
        parts.category_id = 20 AND stocks.manufacturer_id = 4 
    AND feature_titles.title = ('Title One', 'Title Two')
    AND features.value IN ('0.1', '1', '200')
第二个查询比第一个查询宽松,但我以为您说过一些关于搜索过滤器的内容


您在问题中提到“进一步过滤”。没有办法再过滤一个结果了。但别担心,在我的经历中,对和/或的困惑似乎很常见。这是因为我们在英语口语中以非技术性的方式使用这些术语。

我真的看不出所有嵌套的括号有什么意义。我去掉了引号,因为它们有点分散我的注意力

WHERE
        parts.category_id = 20 AND stocks.manufacturer_id = 4 
    AND (
            feature_titles.title = 'Title One' AND features.value IN ('0.1', '1')
        OR  feature_titles.title = 'Title Two' AND features.value = '200'
    )
查看示例数据和查询,我不知道
'200'
值从何而来。我想知道你是不是也有这样的想法

WHERE
        parts.category_id = 20 AND stocks.manufacturer_id = 4 
    AND feature_titles.title = ('Title One', 'Title Two')
    AND features.value IN ('0.1', '1', '200')
第二个查询比第一个查询宽松,但我以为您说过一些关于搜索过滤器的内容


您在问题中提到“进一步过滤”。没有办法再过滤一个结果了。但别担心,在我的经历中,对和/或的困惑似乎很常见。这是因为我们在英语口语中以非技术性的方式使用这些术语。

我真的看不出所有嵌套的括号有什么意义。我去掉了引号,因为它们有点分散我的注意力

WHERE
        parts.category_id = 20 AND stocks.manufacturer_id = 4 
    AND (
            feature_titles.title = 'Title One' AND features.value IN ('0.1', '1')
        OR  feature_titles.title = 'Title Two' AND features.value = '200'
    )
查看示例数据和查询,我不知道
'200'
值从何而来。我想知道你是不是也有这样的想法

WHERE
        parts.category_id = 20 AND stocks.manufacturer_id = 4 
    AND feature_titles.title = ('Title One', 'Title Two')
    AND features.value IN ('0.1', '1', '200')
第二个查询比第一个查询宽松,但我以为您说过一些关于搜索过滤器的内容


您在问题中提到“进一步过滤”。没有办法再过滤一个结果了。但别担心,在我的经历中,对和/或的困惑似乎很常见。这是因为我们在英语口语中以非技术性的方式使用这些术语。

我真的看不出所有嵌套的括号有什么意义。我去掉了引号,因为它们有点分散我的注意力

WHERE
        parts.category_id = 20 AND stocks.manufacturer_id = 4 
    AND (
            feature_titles.title = 'Title One' AND features.value IN ('0.1', '1')
        OR  feature_titles.title = 'Title Two' AND features.value = '200'
    )
查看示例数据和查询,我不知道
'200'
值从何而来。我想知道你是不是也有这样的想法

WHERE
        parts.category_id = 20 AND stocks.manufacturer_id = 4 
    AND feature_titles.title = ('Title One', 'Title Two')
    AND features.value IN ('0.1', '1', '200')
第二个查询比第一个查询宽松,但我以为您说过一些关于搜索过滤器的内容


您在问题中提到“进一步过滤”。没有办法再过滤一个结果了。但别担心,在我的经历中,对和/或的困惑似乎很常见。这是因为我们在英语口语中以非技术性的方式使用这些术语。

中心应该是OR。你基本上是在要求同时有“标题一”和“标题二”的东西。但它只能是其中之一。 试试这个:

SELECT "stocks".* FROM "stocks" INNER JOIN "parts" ON "parts"."id" = "stocks"."part_id" 
INNER JOIN "features" ON "features"."part_id" = "parts"."id" INNER JOIN "feature_titles" ON "feature_titles"."id" = "features"."feature_title_id" 
WHERE "parts"."category_id" = 20 AND "stocks"."manufacturer_id" = 4 
AND ((feature_titles.title = 'Title One' AND (features.value = '0.1' OR features.value = '1')) OR (feature_titles.title = 'Title Two' AND (features.value = '200'))

中心和应为OR。你基本上是在要求同时有“标题一”和“标题二”的东西。但它只能是其中之一。 试试这个:

SELECT "stocks".* FROM "stocks" INNER JOIN "parts" ON "parts"."id" = "stocks"."part_id" 
INNER JOIN "features" ON "features"."part_id" = "parts"."id" INNER JOIN "feature_titles" ON "feature_titles"."id" = "features"."feature_title_id" 
WHERE "parts"."category_id" = 20 AND "stocks"."manufacturer_id" = 4 
AND ((feature_titles.title = 'Title One' AND (features.value = '0.1' OR features.value = '1')) OR (feature_titles.title = 'Title Two' AND (features.value = '200'))

中心和应为OR。你基本上是在要求同时有“标题一”和“标题二”的东西。但它只能是其中之一。 试试这个:

SELECT "stocks".* FROM "stocks" INNER JOIN "parts" ON "parts"."id" = "stocks"."part_id" 
INNER JOIN "features" ON "features"."part_id" = "parts"."id" INNER JOIN "feature_titles" ON "feature_titles"."id" = "features"."feature_title_id" 
WHERE "parts"."category_id" = 20 AND "stocks"."manufacturer_id" = 4 
AND ((feature_titles.title = 'Title One' AND (features.value = '0.1' OR features.value = '1')) OR (feature_titles.title = 'Title Two' AND (features.value = '200'))

中心和应为OR。你基本上是在要求同时有“标题一”和“标题二”的东西。但它只能是其中之一。 试试这个:

SELECT "stocks".* FROM "stocks" INNER JOIN "parts" ON "parts"."id" = "stocks"."part_id" 
INNER JOIN "features" ON "features"."part_id" = "parts"."id" INNER JOIN "feature_titles" ON "feature_titles"."id" = "features"."feature_title_id" 
WHERE "parts"."category_id" = 20 AND "stocks"."manufacturer_id" = 4 
AND ((feature_titles.title = 'Title One' AND (features.value = '0.1' OR features.value = '1')) OR (feature_titles.title = 'Title Two' AND (features.value = '200'))

内部查询将查找与您的条件匹配的特征,然后根据零件id对这些特征进行分组。匹配的特征位于不同的数据行中。要验证零件是否符合多个条件,您必须计算该组中的行数

SELECT stocks.*
FROM stocks
WHERE part_id IN (
    SELECT part_id
    FROM
        parts ON parts.id = stocks.part_id
        INNER JOIN features ON features.part_id = parts.id
        INNER JOIN feature_titles ON feature_titles.id = features.feature_title_id 
    WHERE
            parts.category_id = 20 AND stocks.manufacturer_id = 4
        AND (
                feature_titles.title = 'Title One' AND features.value = '0.1'
            OR  feature_titles.title = 'Title Two' AND features.value = '7 MAX'
        )
    GROUP BY parts.id
    HAVING COUNT(features.id) = 2
)

内部查询将查找与您的条件匹配的特征,然后根据零件id对这些特征进行分组。匹配的特征位于不同的数据行中。要验证零件是否符合多个条件,您必须计算该组中的行数

SELECT stocks.*
FROM stocks
WHERE part_id IN (
    SELECT part_id
    FROM
        parts ON parts.id = stocks.part_id
        INNER JOIN features ON features.part_id = parts.id
        INNER JOIN feature_titles ON feature_titles.id = features.feature_title_id 
    WHERE
            parts.category_id = 20 AND stocks.manufacturer_id = 4
        AND (
                feature_titles.title = 'Title One' AND features.value = '0.1'
            OR  feature_titles.title = 'Title Two' AND features.value = '7 MAX'
        )
    GROUP BY parts.id
    HAVING COUNT(features.id) = 2
)

内部查询将查找与您的条件匹配的特征,然后根据零件id对这些特征进行分组。匹配的特征位于不同的数据行中,以验证零件是否与您必须计算的多个条件匹配