MySQL根据子查询区分两种情况

时间:2016-10-28 02:49:52

标签: mysql sql subquery 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')

如果没有该移动电话号码的用户将返回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则表示用户存在。但我不喜欢这个解决方案,因为用户搜索子查询重复两次,并且明显慢于第一次查询。有关更快解决方案的想法吗?

2 个答案:

答案 0 :(得分:0)

您需要使用完整的外连接,它将返回两个表的结果

http://www.w3schools.com/sql/sql_join_full.asp

答案 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'