MYSQL:选择与多个表的多行相关的条目

时间:2014-07-31 20:58:47

标签: mysql sql database

我有三张表,我无法改变结构:

id     name
-----------------
1      Series
2      Material

id     facet_id     name
----------------------------------
1      2            Glass
2      2            Metal
3      1            Series #1
4      1            Series #2
5      1            Series #3

product_facet_values

product_id     value_id
-----------------------------------
1              1
1              3
2              1
2              4
3              2
3              5
4              1

我正在尝试编写两个查询:

/ 1。将返回表示产品记录为Glass且具有任何系列的值表中的系列构面的ID的一个。所以像这样的输出:

id     facet_id     name
----------------------------------
3      1            Series #1
4      1            Series #2
  • 记录1 系列。
  • 记录2 不是系列。
  • 返回记录3,因为产品#1同时具有系列和材料,并且材料是玻璃。
  • 返回记录4,因为产品#2同时具有系列和材料,并且材料是玻璃。
  • 记录5 返回,因为产品#3具有金属材料,即使它同时具有系列和材料。

/ 2。与第一个相同,但返回产品ID列表。

product_id 
---------------
1
2
  • 产品#1被退回,因为它既有系列又有材料,材料是玻璃。
  • 返回产品#2,因为它既有系列又有材料,材料是玻璃。
  • 产品#3 返回,因为它具有金属材料,即使它同时具有系列和材料设置。
  • 产品#4 返回,因为即使材料是玻璃,它也没有设置系列。

1 个答案:

答案 0 :(得分:0)

第一次查询:

试试这个..我相信这会有所作为。

SELECT 
    v.id
FROM value v
JOIN product_facet_values pfv ON pfv.value_id = v.id
WHERE pfv.product_id IN 
(   SELECT 
        product_id
    FROM product_facet_values
    WHERE
        product_id IN
    (   SELECT 
            product_id
        FROM product_facet_values
        GROUP BY product_id
        HAVING COUNT(*) > 1
    )
        AND value_id = 1
)
    AND v.facet_id = 1;

第二次查询:

同一查询的内部部分返回值为1且值不为1的产品,因此它将是

SELECT 
    product_id
FROM product_facet_values
WHERE
    product_id IN
(   SELECT 
        product_id
    FROM product_facet_values
    GROUP BY product_id
    HAVING COUNT(*) > 1
)
AND value_id = 1

说明:

INNERMOST SUBQUERY:

SELECT 
    product_id
FROM product_facet_values
GROUP BY product_id
HAVING COUNT(*) > 1

为我提供每件产品有多个记录的产品(稍后将通过' Glass''系列'过滤)

MIDDLE SUBQUERY:

SELECT 
    product_id
FROM product_facet_values
WHERE
    product_id IN
(   
    INNERMOST SUBQUERY
)
AND value_id = 1

为我提供具有多个记录的value_id = 1(又名' Glass')的产品。

OUTERMOST QUERY:

SELECT 
    v.id
FROM value v
JOIN product_facet_values pfv ON pfv.value_id = v.id
WHERE pfv.product_id IN 
(
    MIDDLE SUBQUERY
)
    AND v.facet_id = 1;

告诉我与Glass'相关的产品的价值ID但是他们是facet_id = 1(又名系列)

相关问题