首页 > 解决方案 > 我怎样才能做这个mysql查询?如果可能的话

问题描述

我有这张桌子

itemname 属性值
------------------------------------------
大号
一种颜色红色

B码大
B 颜色 蓝色

C尺寸小
C色 蓝色

D尺寸小
D 颜色 蓝色

E尺寸小
E色蓝色

我创建了一个这样的列表:SELECT property,value,COUNT(itemname),GROUP_CONCAT(itemname) FROM table GROUP BY property,value

属性值计数
---------------------------------
大号 2 (A,B)
小号 3 (C,D,E)
红色 1 (A)
蓝色 4 (B,C,D,E)

我想过滤 BIG && SMALL && BLUE 的项目,我怎样才能达到这个结果?(在处理过滤值时,我必须具体说明该属性)

`选择
  属性、值、计数(项目名称)、GROUP_CONCAT(项目名称)
 从
  桌子
 通过...分组
  适当的价值
 拥有
  ( 属性 IN ('size') && value IN ('big','small') )
  &&
  ( 属性 IN ('color') && value IN ('blue') )`

但这没有结果,因为它试图同时匹配行的大小和颜色?在这种情况下,我想要的输出是避免项目 A,因为它是红色的,如下所示:

属性值计数
---------------------------------
size big 1 (B) A 不在这里,因为它是红色的
size small 3 (C,D,E) 没有变化,因为都是蓝色的
color red 0 (A) 没有选择红色,所以这一行应该是 0 或者根本不列出
颜色蓝色 4 (B,C,D,E) 所有 4 都是大或小和蓝色

请有人帮我解决这个问题,我花了两天时间想知道解决方案。我可以将 CASE 与 HAVING 结合使用吗?或者我应该以某种方式解决 WHERE 问题?
注意:这个表实际上不是真实的,但如果这个问题可以解决,我可以在我的真实表中使用它,这要复杂得多。

标签: mysqli

解决方案


我自己想出了一个解决方案,当然这个示例表是胡说八道,关键是它的解决方式。

`
选择  
  财产,  
  价值,  
  COUNT(t.itemname) 作为计数  
从 (
  选择
    项目名
  从
    桌子
  通过...分组
    项目名
  拥有
    COUNT (CASE WHEN property='size' AND value IN ('big','small') THEN 1 END) >=1  
    &&
    计数(CASE WHEN property='color' AND value IN ('blue') THEN 1 END)>=1
   ) 吨
内部联接
  表 ON table.itemname=t.itemname
通过...分组
  适当的价值
`

推荐阅读