比较几个字段和一个表

时间:2013-11-30 15:43:51

标签: mysql sql

说我有下一个表:药物和客户:

 idNum      | drugName  
 118        | drug1    
 118        | drug2   
 120        | drug1       
 120        | drug2       
 120        | drug3  
 121        | drug1       
 121        | drug3  
 122        | drug2    

客户端:

idNum   |   Name     |   lastName   |
 118    |   name1    |     last1    |
 119    |   name2    |     last2    |
 120    |   name3    |     last3    |
 121    |   name4    |     last4    | 
 122    |   name5    |     last5    | 

我想创建一个新表,其中包含使用idNum ='118'的客户使用相同药物的客户的所有ID,姓名和姓氏

这意味着我需要一张只有'120'的桌子。

到目前为止我已经:

SELECT Clients.idNum,firstName, lastName   
FROM Clients, Drugs
WHERE Drugs.idNum=Clients.idNum
AND Clients.idNum<>'118' 
AND Clients.idNum IN 
(Select idNum From Drugs Where drugName IN 
(Select  drugName from Drugs where idNum='118'))

但是这给了我121和122。 我猜'IN'就像'存在',所以如果有人只有一种药物就足够了。我如何实际比较从这里得到的表格:

  (Select  drugName from Drugs where idNum='118')

到'药物'中的一个字段?

或许,我如何为每个客户创建一个表,然后将其与表进行比较?

1 个答案:

答案 0 :(得分:0)

这是一个棘手的查询。该想法是为与客户端118匹配的每个客户端生成药物列表。这是“主”列表。然后,使用left outer join为每个客户带来实际药物。当匹配失败时,请过滤掉客户端:

select master.idNum, master.firstName, master.lastName
from (select d.drugName, c.*
      from Drugs d cross join
           Clients c
      where d.idnum = 118
     ) master left outer join
     Drugs d
     on master.drugName = d.drugName and
        master.idNum = d.idNum
group by master.idNum, master.firstName, master.lastName
having count(d.drugName) = count(master.drugName);

SQL小提琴是here。如果要另外过滤掉客户端118,则将嵌套的where子句更改为d.idnum = 118 and c.idnum <> 118

您还应该学习正确的连接语法和表别名的使用。