我有一个查询,它返回给定用户的所有事件。但首先,它会在给定用户手机号码的子查询中搜索用户。
SELECT e.user_id, e.id FROM events e
WHERE e.user_id = (SELECT u.user_id FROM users u WHERE u.mobile = '88888888')
如果没有该移动电话号码的用户将返回0行。如果用户存在但没有事件,则也将返回0行。我希望能够区分这两种情况。知道如何在一个查询中做到这一点吗?
这是我的方法:
(SELECT (SELECT u.user_id FROM users u WHERE u.mobile = '88888888'), NULL)
UNION
(SELECT e.user_id, e.id FROM events e
WHERE e.user_id = (SELECT u.user_id FROM users u WHERE u.mobile = '88888888'))
通过这种方式,我知道我将至少有一行只检查用户是否存在。因此,如果第一行中的user_id为NULL则表示没有用户,如果不是NULL则表示用户存在。但我不喜欢这个解决方案,因为用户搜索子查询重复两次,并且明显慢于第一次查询。有关更快解决方案的想法吗?
答案 0 :(得分:0)
您需要使用完整的外连接,它将返回两个表的结果
答案 1 :(得分:0)
如果您想要一个显示所有事件和用户的结果集,无论事件是映射到用户还是反之亦然,那么您可以尝试模拟全外连接:< / p>
SELECT COALESCE(u.user_id, 'NA'),
COALESCE(e.id, 'NA')
FROM events e
LEFT JOIN users u ON e.user_id = u.user_id
WHERE u.mobile = '88888888'
UNION ALL
SELECT COALESCE(u.user_id, 'NA'),
COALESCE(e.id, 'NA')
FROM events e
RIGHT JOIN users u ON e.user_id = u.user_id
WHERE u.mobile = '88888888'