我有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
答案 0 :(得分:2)
您对笛卡儿产品的看法是正确的。无需任何条件即可加入users
和alerts
来实现。找到丢失的对只是使用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;