产品属性表上的SQL查询

时间:2014-11-07 10:23:25

标签: php mysql

我有一个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

2 个答案:

答案 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