MySQL:加入以查找不匹配的字段

时间:2014-11-24 16:20:43

标签: mysql join

我有两张桌子。

客户&语音邮件

Customer有2列与此问题有关,ID& Voicemail
Voicemail有2列与此问题相关,ID& Customer

没有奖品可以猜测Customer.IDVoicemail.Customer有关,Customer.VoicemailVoicemail.ID有关。

我需要获得Customer.Voicemail == Voicemail.IDCustomerID!= Voicemail.Customer的结果。

我不需要在Customer.Voicemail == Voicemail.ID CustomerID == Voicemail.Customer时返回结果,因为它们应该是正确的。

我尝试过使用INNER JOIN,但是我可以使用&&吗?尝试使用连接时,我的心理图像总是模糊

架构帮助:

Customer
+---+---------+
|ID |Voicemail|
+---+---------+

Voicemail
+---+---------+
|ID | Customer|
+---+---------+ 

2 个答案:

答案 0 :(得分:2)

从您的架构中稍微猜一下,看起来您想要这个查询。

SELECT v.ID AS Voicemail_ID,
       c.ID AS Customer_ID, 
       c.some_other_field, 
       v.some_other_field
  FROM Voicemail AS v
 INNER JOIN Customer AS c ON v.ID = c.Voicemail
 WHERE c.ID <> v.Customer

这将为每个语音邮件行提取所有相关的客户行,然后丢弃客户已指回语音邮件的行。

专业提示:对表和列使用相同的名称可能会造成混淆。如果我是你,我会像这样重做列名

Customer:   Customer_ID (pk), Voicemail_ID, other columns

Voicemail:  Voicemail_ID (pk), Customer_ID, other columns

然后你可以像这样重写你的查询:

SELECT v.Voicemail_ID,
       c.Customer_ID,
       c.some_other_field,
       v.some_other_field
  FROM Voicemail AS v
 INNER JOIN Customer AS c USING(Voicemail_ID)
 WHERE c.Customer_ID <> v.Customer_ID

对于您的项目的下一个人来说,这可能更容易理解。

答案 1 :(得分:0)

我认为你可以做到:

  INNER JOIN Voicemail ON Customer.Voicemail = Vocemail.id AND Customer.id != Voicemail.Customer

希望它有所帮助!