SQL连接(包含/排除)不起作用

时间:2013-05-11 14:19:28

标签: mysql sql join

在我的PHP / Mysql应用程序中,我有3个表来存储产品/功能信息:

product
id      brand      ref      mod
2675    Brand 1    123456   Model X
3644    Brand 2    78910    Model Y
3984    Brand 3    35532    Model Z

function
id   name          active    sort_order
0    NONE          1         0
1    Function 1    1         0
2    Function 2    1         0
3    Function 3    1         0

product2function
id   product_id   function_id
2    2675         1
3    3644         1
4    3644         2
5    3984         1

表product2函数用于在产品和它们可用的功能之间建立链接。

一种产品可以具有一种或多种功能。

使用JOIN获取给定产品ID的可用函数的SQL查询不是问题,它可以正常工作。

现在我需要设置一个SQL查询,它应该返回更准确的结果:

在示例中,我需要检索仅具有功能1(id = 1)的所有产品。不是功能1,也可能是一个或多个其他功能1.

在我的情况下,这意味着不应该返回产品3644,因为它具有函数id = 1并且函数id = 2。

我试图使用IN语法获得预期结果,但没有成功。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

SELECT  a.id, a.brand
FROM    product a
        INNER JOIN product2function b
            On a.ID = b.product_id
WHERE   b.function_id = 1 AND
        EXISTS  -- this part checks the number of functions of the product
        (
            SELECT  1
            FROM    product2function c
            WHERE   c.product_id = b.product_id
            GROUP   BY  c.product_id
            HAVING  COUNT(DISTINCT function_id) = 1
        )
GROUP   BY  a.id, a.brand
HAVING  COUNT(*) = 1

预期输出

╔══════╦═════════╗
║  ID  ║  BRAND  ║
╠══════╬═════════╣
║ 2675 ║ Brand 1 ║
║ 3984 ║ Brand 3 ║
╚══════╩═════════╝

部分问题陈述:“..我需要检索所有产品仅具有功能1 (id = 1)。不是功能1而是一个或许多其他,仅限功能1 。“

答案 1 :(得分:0)

SELECT * FROM product pr
WHERE EXISTS (
  -- all the products that have a Function=1
  SELECT *
  FROM product2function ex
  WHERE ex.product_id = pr.id
  AND ex.function_id = 1
  )
AND NOT EXISTS (
  -- ... but don't have an other function than 1
  SELECT *
  FROM product2function nx
  WHERE nx.product_id = pr.id
  AND nx.function_id <> 1
  )
  ;