Mysql选择与使用复选框选择的类别完全匹配的行

时间:2018-06-06 10:38:12

标签: mysql

我有三个复选框和一个仅显示交叉点的附加选项

复选框

  1. 绿色
  2. 可持续
  3. 社会
  4. 和另一个复选框说:检查以显示交叉点

    因此当有人选择Green时,他们需要查看所有绿色产品,如果他们选择Green and Social,他们会看到所有附有绿色标签或社交标签的产品,这可以通过WHERE product_category_id IN来完成。 (1,11)等等。

    现在,当有人检查绿色和社交,并且附加复选框仅显示交叉点时我想只显示产品eaxactly两个标签已分配。即只有那些同时具有绿色和社会标签而忽略其余标签的人。

    从下表中的绿色和社交应该返回

    id          organisation_name
    -----------------------------------------------
    3221        Nederlandse Watershapsbank NV
    

    如果有人选择绿色,可持续和社交以及相交选项,他们应该只看到

    id        organisation_name
    --------------------------------
    21        Uppsalahem AB
    

    希望我尽力解释,如果您需要更多信息,请告诉我。

    产品表

    id         issuer
    -------------------------
    1          1   
    11         1741 
    21         21  
    31         31  
    41         3221
    51         51  
    

    组织表

    id          organisation_name
    ----------------------------------------
    1           Nordic Investment Bank
    21          Uppsalahem AB
    31          Stangastaden
    51          European Investment Bank
    1741        Global Infrastructure Partners
    3221        Nederlandse Watershapsbank NV
    

    项目类别表

    id          product_id      product_category_id
    --------------------------------------------------
    1           1               1
    2           11              1
    3           21              1
    4           31              1
    5           41              1
    5           41              61
    6           51              1
    6           51              11
    6           21              61
    6           21              11
    

    项目类别表

    id          product_category_name
    --------------------------------------
    1           Green      
    11          Sustainable
    61          Social
    

    SQL:

    SELECT Products.id,
    Organisation.organisation_name, 
    ProductCategory.product_category_id, 
    ProductCategory.product_id  
    FROM `Products`  
    LEFT JOIN `product_category` `ProductCategory` ON ProductCategory.product_id=Products.id  
    LEFT JOIN `organisation` `Organisation` ON Organisation.id=Products.issuer 
    LEFT JOIN `categories` `Categories` ON Categories.id=ProductCategory.product_category_id 
    WHERE `ProductCategory`.`product_category_id` IN (1, 11)  
    GROUP BY Products.id  HAVING COUNT(*) = 2 
    ORDER BY Products.id ASC;
    

    提前多多感谢。非常感谢您的努力。

1 个答案:

答案 0 :(得分:0)

虽然我可能会在表示层中执行此操作,但您正在寻找的逻辑如下:

...GROUP BY ... HAVING COUNT(DISTINCT ...) = n

其中:

DISTINCT是可选的但不会造成伤害

n等于IN()

中的参数个数