【问题标题】:SQL query on product attribute table产品属性表SQL查询
【发布时间】:2014-11-07 10:23:24
【问题描述】:

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

【问题讨论】:

  • 什么是attrvalid
  • 列 arributevalueid
  • 这里没有骄傲
  • 对不起,我编辑了表格标题
  • 只有 522 有 48 个,只有 521 有 43 个。那么你为什么期望它们都有呢?

标签: php mysql


【解决方案1】:

因此,如果我正确理解这一点(恐怕我没有),如果这两个值来自不同的属性集,那么只选择同时具有这两个值的 proid 吗?如果这两个值来自同一个属性集,只选择至少有一个的proids?

如果是这样,我就这样走过。我需要知道我有多少个属性组,所以我编写了这个查询来获取属性组的数量:

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 上工作。

【讨论】:

【解决方案2】:
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

【讨论】:

  • 它不正确,根据此如果您尝试 SELECT proid FROM tbl_proattrconnect WHERE attrvalid IN (16,36) GROUP BY proid 查询它显示 2 个产品,但它需要显示一个产品,因为 16 和 36 是属性不同属性的价值观
  • @smithbandara 已更新,抱歉我在阅读您的表格时犯了错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-24
  • 2016-06-04
  • 2018-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多