如何使用mySQL选择一个表中不在另一个表中的行?

时间:2017-12-01 21:03:47

标签: php mysql

这是我的查询的一部分。以下查询返回如下所示的行:

ref = Google 以及hash is found表格上的elements_actions

但是,我想得到以下行: ref = Google但现在,hash is NOT found进入elements_actions表。

例如,如果 所有来自Google的都是100,以下查询返回60,new_table 200行,这意味着相反的必须返回40。

我试着用elements_actions.hash != new_table.hash没有运气。

FROM behaviour, new_table, elements_actions
                WHERE 
                     behaviour.ref = 'Google' 
                     AND elements_actions.hash = new_table.hash 
                     AND elements_actions.element_id = 3 

2 个答案:

答案 0 :(得分:0)

可能最直接的方法是直接向DB询问使用“NOT EXISTS”在该表中不存在哪些

FROM behaviour, new_table
WHERE 
 behaviour.ref = 'Google' 
 AND NOT EXISTS (SELECT * FROM elements_actions WHERE elements_actions.hash = new_table.hash AND elements_actions.element_id = 3)

您还可以在elements_actions.hash = new_table.hash上使用左外连接,然后在WHERE子句中检查“new_table.hash is null”。

答案 1 :(得分:0)

您想使用左外连接。您的帖子没有显示行为和elements_actions之间的联接,因此您需要添加它。

 FROM behaviour
      JOIN elements_actions ON ([[you need to provide the join columns here between behavior and elements_actions]])
      LEFT OUTER JOIN new_table ON (elemtns_actions.hash = net_table.hash)
WHERE behaviour.ref = 'Google' 
  AND elements_actions.element_id = 3 
  AND new_table.hash IS NULL

左外连接返回内部连接中的所有值以及左表中与右表不匹配的所有值,包括链接列中具有NULL(空)值的行。

这个维基百科条目有很多关于联接类型的好信息,但它可以通过数学来咄咄逼人。 https://en.wikipedia.org/wiki/Join_(SQL)#Left_outer_join