在我的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语法获得预期结果,但没有成功。
提前感谢您的帮助。
答案 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
)
;