我怎样才能使这个MySQL查询?如果可能的话

时间:2019-01-03 12:52:18

标签: mysqli

我有这张桌子

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吗?还是我应该以某种方式在哪里发言?
注意:该表实际上不是真实的,但是如果可以解决此问题,则可以在实际的表中使用它,该表要复杂得多。

1 个答案:

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