获取mysql

时间:2018-03-05 15:58:12

标签: mysql

我正在寻找的是只能返回按产品ID过滤的选定包的查询。

即使我只选择一个产品,查询也应只返回在where子句中定义的记录,如果指定的产品ID也包含在其他包中,则不应返回记录。

表格示例

套餐表

    id  package_name           
------  ------------

     2  STANDARD               
     3  BUSINESS               
     5  BASIC                  
     6  CLASSIC                

package_product表

    id  package_id  product_id  
------  ----------  ------------

     2           3            52
     3         230            52
     4         230            53
     5           2            52
     6           2            53
     7           5            52
     8           5            53 

产品表

    id  product_name          
------  ----------------------

    52  Logo Design           
    53  Website Design        
    54  Business Card Design 

查询我正在尝试使用

SELECT p.id, p.package_name, p.package_price, pp.product_id
FROM package_product pp INNER JOIN packages p ON p.id = pp.package_id
WHERE pp.product IN (52, 53)

结果我得到了什么

    id  package_name  package_price  product_id  

------  ------------  -------------  ------------

         3  BUSINESS      139                      52
       230  ULTIMATE      1149                     52
       230  ULTIMATE      1149                     53
         2  STANDARD      89                       52
         2  STANDARD      89                       53
         5  BASIC         265                      52
         5  BASIC         265                      53

我在寻找什么

    id  package_name  package_price  product_id  

------  ------------  -------------  ------------

       230  ULTIMATE      1149                     52
       230  ULTIMATE      1149                     53
         2  STANDARD      89                       52
         2  STANDARD      89                       53
         5  BASIC         265                      52
         5  BASIC         265                      53

1 个答案:

答案 0 :(得分:0)

您可以加入子查询,该子查询强制限制匹配包具有52和53个产品:

SELECT
    p.id,
    p.package_name,
    p.package_price,
    pp.product_id
FROM package_product pp
INNER JOIN
(
    SELECT package_id
    FROM package_product
    WHERE product_id IN (52, 53)
    GROUP BY package_id
    HAVING COUNT(DISTINCT product_id) = 2
) t
    ON pp.package_id = t.package_id
INNER JOIN packages p
    ON p.id = pp.package_id;

enter image description here

Demo

上面的t别名的子查询找到包含52和53产品的那些包。用作内部联接,它会过滤掉不匹配的包。