循环检查从一个表到另一个表的条件

时间:2017-04-27 08:51:17

标签: mysql sql database

我有两个表品牌和generic_Drugs。一个generic_Drugs模型可以有许多品牌模型。因此,generic_Drugs ids存储在品牌模型中。然而,当删除仿制药时,其ID仍然存在于品牌模型中 - 这就是我的应用程序根据用户要求的行为方式。

我需要一种从数据库中检索品牌商品的技术,它只检索generic_drug类存在于generic_drug类表中的品牌商品。

示例:

品牌型号 - 品牌表

    +--------+-----------+
    | id     |Generic id |    
    +--------+-----------+
    |      1 | 2001      | 
    |      2 | 2001      | 
    |      3 | 2002      | 
    |      4 | 2003      | 
    |      5 | 2004      | 
    |      6 | 2004      |
    |      7 | 2005      |
    |      8 | 2006      | 
    |      9 | 2006      | 
    +--------+-----------+

Generic_Drugs - genericDrugs表

    +-----------+
    | id        |    
    +-----------+
    | 2001      | 
    | 2002      | 
    | 2003      |
    | 2005      |
    +-----------+

所以我需要一种技术来列出品牌中所有品牌商品,使用条款应用于品牌表中generic_drug id的条件,并仅列出泛型ID存在于generic_drugs表中的那些品牌:

因此,当我运行查询时,它应仅检索:

    +--------+-----------+
    | id     |Generic id |    
    +--------+-----------+
    |      1 | 2001      | 
    |      2 | 2001      | 
    |      3 | 2002      | 
    |      4 | 2003      | 
    |      5 | 2004      | 
    |      7 | 2005      |
    +--------+-----------+

2 个答案:

答案 0 :(得分:0)

我们可以使用INNER JOIN。

SELECT DISTINCT(b.id) 
FROM brands b INNER JOIN genericDrugs gd
ON b.`Generic id` = gd.id

仅检索匹配的记录。

答案 1 :(得分:0)

你可以通过两种方式实现同​​样的目标。一种是使用INNER JOIN

 SELECT Id
 FROM Brand b
 INNER JOIN generic_Drugs gd ON gd.id=b.`Generic id` 

另一个是使用EXISTS

SELECT Id
FROM Brand b
WHERE EXISTS( SELECT 1
              FROM generic_Drugs 
              WHERE b.`Generic id`=id )

如果一个品牌在没有仿制药的情况下不能存在,那么我建议你在删除仿制药时删除相应的品牌。所以你不必在选择中进行调整查询。您可以将Generic id品牌表添加为FK,然后删除相应的品牌记录。