-1

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

产品
id 品牌参考 mod
2675 品牌 1 123456 型号 X
3644 品牌 2 78910 Y 型
3984 品牌 3 35532 Z 型

功能
id 名称 活动 sort_order
0 无 1 0
1 功能 1 1 0
2 功能 2 1 0
3 功能 3 1 0

产品2功能
id product_id function_id
2 2675 1
3 3644 1
4 3644 2
5 3984 1

表 product2function 用于在产品和产品上可用的功能之间建立链接。

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

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

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

例如,我需要检索只有功能 1 (id=1) 的所有产品。不是功能 1,也可能是一个或多个其他功能,只有功能 1。

就我而言,这意味着不应返回产品 3644,因为它具有函数 id=1 和函数 id=2。

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

预先感谢您的帮助。

4

2 回答 2

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。

于 2013-05-11T14:24:34.467 回答
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
  )
  ;
于 2013-05-11T14:30:57.920 回答