查询以查找两个表/查询之间不存在的链接

时间:2014-06-11 00:48:37

标签: mysql sql

我有3张桌子

USERS
user_id

ALERTS
alert_id

USER_ALERTS
user_id
alert_id
show_alert

我需要找出哪些用户没有链接到哪些提醒 所以对于以下数据:

USER

user_id
--------
1       
2  

说注意

alert_id
--------
9       
8   
7

USER_ALERTS

user_id alert_id
------- --------
1             9   
2             9   
1             8   
2             8  
1             7 

查询应该返回

user_id alert_id
------- --------
2             7 

我可以通过加入2个表来找到未链接到任何用户的警报:

select a.alert_id, ua.alert_id, ua.user_id from alerts a 
left join 
user_alerts ua 
on    a.alert_id = ua.alert_id
where u.alert_id is null;

但我似乎无法返回用户和未链接的警报 - 我需要使用缺少的行更新链接表。

我可以加入所有3个表(几乎返回user_alerts行):

SELECT u.user_id, ua.alert_id FROM user u 
LEFT OUTER JOIN user_alerts ua on u.user_id = ua.user_id
LEFT OUTER JOIN alerts a on a.alert_id = ua.alert_id;

我可以尝试采用笛卡尔积法 - 将所有用户与所有警报相结合

 SELECT u.user_id, a.alert_id from user u, alerts a

向所有当前用户发送提醒

 SELECT ua.user_id, ua.alert_id from user_alerts ua

现在我需要第一个查询中不在第二个查询中的所有值,但不确定如何从这里到达那里。

有人有什么想法吗?

我正在使用mySQL

1 个答案:

答案 0 :(得分:2)

您对笛卡儿产品的看法是正确的。无需任何条件即可加入usersalerts来实现。找到丢失的对只是使用left join

进行过滤
select a.*
from (
  select user_id, alert_id
  from users
  join alerts) a
left join user_alerts b on a.user_id = b.user_id and a.alert_id = b.alert_id
where b.user_id is null;

演示:http://sqlfiddle.com/#!2/eb803/2