从一个表中获取行,该表在另一表中的ID有条件(不知道如何命名)

时间:2018-11-22 21:45:12

标签: mysql sql

恐怕我在标题中提出的问题是错误的...

我在数据库中有两个与此问题有关的表

产品

  • product_id
  • 名称

类别

  • id
  • product_id
  • category_id

我需要创建两个查询。

一个获得具有product_category = 1product_category = 2product_category = 3 [...]的产品ID的人。

第二个是获得products idproduct_category = 1product_category = 2 [...]

product_category = 3

我已经尝试了所学到的所有内容,但没有任何效果 我应该使用哪种查询?

编辑:

以下是一些示例行和预期结果

产品

ID | Name 
------------
1  | Prod_3
------------
2  | Prod_4
------------
3  | Prod_5
------------
4  | Prod_6

类别

ID | ProductID | CategoryID
----------------------------
1  |     1     |     101
----------------------------
2  |     1     |     102
----------------------------
3  |     1     |     103
----------------------------
4  |     2     |     102
----------------------------
5  |     2     |     103
----------------------------
6  |     2     |     108
----------------------------
7  |     3     |     121
----------------------------
8  |     3     |     111

我要从Name表中选择Products。该产品应在Categories表中,并具有特定的CategoryID

示例1:

Select `ID`, `Name` From `Products`

WHERE IN `Categories`.`ProductID` = `Products`.`ID`

AND (`Categories`.`CategoryID` = 103 AND `Categories`.`CategoryID` = 102)

这应该导致:

ID | Name 
------------
1  | Prod_3
------------
2  | Prod_4

示例2:

Select `ID`, `Name` From `Products`

WHERE IN `Categories`.`ProductID` = `Products`.`ID`

AND (`Categories`.`CategoryID` = 108 OR `Categories`.`CategoryID` = 121)

这应该导致:

ID | Name 
------------
2  | Prod_4
------------
3  | Prod_5

3 个答案:

答案 0 :(得分:0)

听起来像您需要这样的东西:

select distinct p.ID, p.Name
from Products P 
  inner join Categories C on c.ProductId = p.ID 
where c.CategoryID in (108, 121)

答案 1 :(得分:0)

您可以使用group byhaving来获得具有 all 类别的产品:

select p.ID, p.Name
from products p join
     categories c
     on c.productid = p.id
where c.categoryid in (102, 103)
group by p.id, p.name
having count(*) = 2;  -- number of items in the `in` list

答案 2 :(得分:0)

我最终得到:

SELECT a.product_id FROM `product_categories` a

INNER JOIN (SELECT * FROM product_categories WHERE category_id = 1655) a1 ON 
a1.product_id = a.product_id
INNER JOIN (SELECT * FROM product_categories WHERE category_id = 1605) a2 ON

[...]

a2.product_id = a.product_id

WHERE a.category_id = 1575