如何编写SQL查询以包含完全未出现在matches表中的用户?
解决方案
你的问题出在INNER JOIN上——它只会保留同时存在于profile和matches表中的用户,自然漏掉了从未有过匹配记录的人。另外注意你的SQL里有个拼写错误:profiel.usernumber应该是profile.usernumber。
这里给你两种可行的修改方案:
方案一:LEFT JOIN + 条件过滤
把INNER JOIN改成LEFT JOIN,通过判断匹配记录是否为空来包含从未匹配过的用户,同时保留未与你匹配的已有用户:
SELECT age, hobbies, country FROM profile LEFT JOIN matches ON profile.usernumber = matches.user1 WHERE age BETWEEN ? AND ? AND profile.usernumber != ? AND ( matches.user1 IS NULL -- 从未有过匹配记录的用户 OR profile.usernumber NOT IN (SELECT user2 FROM matches WHERE matches.user1 = ?) )
方案二:直接从profile筛选(更简洁)
直接从profile表中提取数据,排除你自己、年龄不符合的用户,再排除所有和你有过匹配记录的用户(不管你是匹配发起方还是接收方):
SELECT age, hobbies, country FROM profile WHERE age BETWEEN ? AND ? AND usernumber != ? AND usernumber NOT IN ( -- 你发起匹配的对象 SELECT user2 FROM matches WHERE user1 = ? UNION -- 发起匹配你的对象 SELECT user1 FROM matches WHERE user2 = ? )
方案二更推荐,逻辑清晰且不会因用户有多个匹配记录而返回重复行。
内容的提问来源于stack exchange,提问作者Rockyro
相关产品推荐
相关产品推荐

