我有这张桌子
itemname property value ------------------------------------------ A size big A color red B size big B color blue C size small C color blue D size small D color blue E size small E color blue
我正在创建一个像这样的列表:SELECT property,value,COUNT(itemname),GROUP_CONCAT(itemname) FROM table GROUP BY property,value
property value count --------------------------------- size big 2 (A,B) size small 3 (C,D,E) color red 1 (A) color blue 4 (B,C,D,E)
我要过滤BIG && SMALL && BLUE的项目,我怎样才能达到这个结果? (在寻址要过滤的值时,我必须具体说明该属性)
`SELECT property,value,COUNT(itemname),GROUP_CONCAT(itemname) FROM table GROUP BY property,value HAVING ( property IN ('size') && value IN ('big','small') ) && ( property IN ('color') && value IN ('blue') )`
但这没有结果,因为它试图同时匹配具有大小和颜色的行?在这种情况下,我想要的输出是避免使用项目A,因为它是红色的,就像这样:
property value count --------------------------------- size big 1 (B) A not here, because it is red size small 3 (C,D,E) no change because all are blue color red 0 (A) no red is selected, so this row should be 0 or not listed at all color blue 4 (B,C,D,E) all the 4 are big or small and blue
请有人帮我解决这个问题,我迷失了2天的时间想知道解决方案。
我可以结合使用CASE和HAVING吗?还是我应该以某种方式在哪里发言?
注意:该表实际上不是真实的,但是如果可以解决此问题,则可以在实际的表中使用它,该表要复杂得多。
答案 0 :(得分:0)
我自己想出了一个解决方案,当然这个示例表是胡说八道,关键是它的解决方法。
` SELECT property, value, COUNT(t.itemname) AS count FROM ( SELECT itemname FROM table GROUP BY itemname HAVING COUNT (CASE WHEN property='size' AND value IN ('big','small') THEN 1 END) >=1 && COUNT (CASE WHEN property='color' AND value IN ('blue') THEN 1 END) >=1 ) t INNER JOIN table ON table.itemname=t.itemname GROUP BY property,value `