我有一个mysql表,其中包含产品和属性关系,如下所示
id proid attributeid attrvalid
18 521 12 36
17 521 11 43
16 521 9 16
29 522 18 168
28 522 17 138
27 522 16 115
26 522 15 71
25 522 12 36
24 522 11 48
23 522 9 19
我编写了一个mysql查询来获取与给定属性ID匹配的产品ID
ex-此查询返回产品ID 521,因为16和36两个属性值都在521产品上(但不同的属性)
SELECT proid
FROM tbl_proattrconnect
GROUP BY proid
HAVING SUM(attrvalid IN (16,36)) >=2
但我遇到了相同属性设置值的问题
ex-如果我通过48和43(48和43值在同一属性集中)我没有得到任何结果但它应该返回521和522
SELECT proid
FROM tbl_proattrconnect
GROUP BY proid
HAVING SUM(attrvalid IN (48,43)) >=2
任何人都可以更正此查询,我需要同时处理这两种情况,非常感谢
表示实例 如果客户选择我想要同时展示两者的产品品牌如三星和索尼相同的属性,但如果客户选择三星和索尼和颜色从另一个属性我想显示三星和索尼结果只选择颜色,我有大约10个attibutes
答案 0 :(得分:1)
SELECT DISTINCT(sub.proid) FROM (
SELECT *
FROM tbl_proattrconnect
WHERE attrvalid IN (16, 36)
ORDER BY proid, attributeid
) sub
GROUP BY sub.attrvalid;
SELECT DISTINCT(sub.proid) FROM (
SELECT *
FROM tbl_proattrconnect
WHERE attrvalid IN (48, 43)
ORDER BY proid, attributeid
) sub
GROUP BY sub.attrvalid
答案 1 :(得分:1)
因此,如果我正确理解这一点(我恐怕不这样做),如果这两个值来自不同的属性集,那么只选择具有两者的proids?如果这两个值来自同一属性集,则只选择至少有一个?
的proid如果是这样的话,我会像这样走过去。我需要知道我有多少个属性组,所以我编写了这个查询来获取属性组的数量:
SELECT COUNT(*) AS numAttributeGroups
FROM(SELECT DISTINCT attributeid
FROM myTable
WHERE attrvalid IN (16, 36)) t;
对于这个特定的,它将返回2的计数,因为16在组9中,36在组12中。
所以,你可以做的是在你的having子句中放一个case语句,说明如果上面的查询返回2,那么只返回有2个或更多attrvalids的proid。如果上面的查询没有,您可以返回所有内容。这有点难看,但看起来像这样:
SELECT proid
FROM myTable
WHERE attrvalid IN (16, 36)
GROUP BY proid
HAVING(CASE WHEN (SELECT COUNT(*) AS numAttributeGroups
FROM(SELECT DISTINCT attributeid
FROM myTable
WHERE attrvalid IN (16, 36)) t
) = 2
THEN COUNT(*)
ELSE 2 END) >= 2;
它适用于SQL Fiddle。