2013-05-11 57 views
-1

在我的PHP/MySQL的应用程序,我有3个表来存储产品/功能信息:SQL连接(包含/排除)不工作

 
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 

表product2function用来使产品和之间的联系功能(S)可用。

一个产品可以有一个或多个功能。

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

现在我需要建立一个SQL查询应返回更精确的结果:

在例子中,我需要检索的所有产品(第),具有唯一的功能1(ID = 1)。不是功能1,也许是一个或许多其他,只有功能1.

在我的情况下,这意味着产品3644不应该返回,因为它有功能ID = 1和功能ID = 2。

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

非常感谢您的帮助。

回答

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(S)(id = 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 
) 
    ; 
+0

感谢wildpasser,你的代码是exactely我所需要的。因为我可以指定多个函数来包含和排除,所以我使用ex.function_id IN(1,2,...)来更改where子句。 – 2013-05-11 15:55:26

+0

尊敬的野人,恐怕我需要重新打开这个问题,因为,您昨天给出的解决方案正在工作,只要我需要检查一个函数。 在上面描述的数据中,如果我只需要检查函数= 1,它就可以工作。 由于我的产品可以有多个功能,我需要能够建立一个SQL查询返回,即只有产品function = 1和功能= 2。 不应返回只有函数= 1或函数= 2的产品。 我试图添加AND到where子句,不幸没有成功。 希望你能帮助我。 – 2013-05-12 19:58:09