【问题标题】:MySQL where IN from joined tableMySQL where IN 来自连接表
【发布时间】:2020-02-14 15:34:19
【问题描述】:
i have 2 tables (example):

product:

|  id | name                |
|  1  | product1            |
|  2  | product2            |
|  3  | product3            |

product_categories:

|  product_id | category_id |
|      1      |      5      |
|      1      |      3      |
|      2      |      5      |
|      3      |      17     |
|      3      |      5      |

我想选择类别 id 为 5 和 3 的产品。

SELECT p.* 
  FROM products p 
  LEFT 
  JOIN product_categories pc 
    ON pc.product_id = p.id
 WHERE ?

【问题讨论】:

    标签: mysql join where-clause


    【解决方案1】:
    SELECT p.* FROM products p LEFT JOIN product_categories pc ON (pc.product_id = p.id) AND pc.category_id in (3,5);
    
    (in case you do want unmatched rows)
    

    或者

    SELECT p.* FROM products p INNER JOIN product_categories pc ON (pc.product_id = p.id) WHERE pc.category_id in (3,5)
    
    (if you're sure that you don't)
    

    【讨论】:

    • 请注意,这是一个 INNER JOIN
    • 为清晰起见编辑
    【解决方案2】:

    没有必要使用LEFT JOIN,因为您不想要不匹配的行。
    按产品分组,并在HAVING 子句中设置产品具有两个类别的条件:

    SELECT p.id, p.name 
    FROM products p INNER JOIN product_categories pc 
    ON pc.product_id = p.id
    WHERE pc.category_id IN (3, 5)
    GROUP BY p.id, p.name
    HAVING COUNT(DISTINCT pc.category_id) = 2
    

    【讨论】:

      【解决方案3】:

      你可以这样写:

      SELECT p.* FROM products p 
      LEFT JOIN product_categories pc ON (pc.product_id = p.id) 
      WHERE category_id IN (5,3)
      

      【讨论】:

      • 这也是一个 INNER JOIN
      猜你喜欢
      • 1970-01-01
      • 2016-11-20
      • 2018-01-20
      • 2016-05-07
      • 2016-03-31
      • 1970-01-01
      • 2014-10-23
      • 2021-05-17
      • 1970-01-01
      相关资源
      最近更新 更多