SQL一对多查询:获取非指定用户创建及投票的idea_id列表
解决方案:获取符合条件的创意ID列表
方法一:LEFT JOIN + IS NULL
通过左连接关联创意表和当前用户的投票记录,筛选出无匹配投票记录的创意,同时排除用户自己创建的:
SELECT i.id AS idea_id FROM Idea i LEFT JOIN Votes v ON i.id = v.idea_id AND v.voter_id = auth.uid() -- 仅关联当前用户的投票记录 WHERE i.created_by != auth.uid() -- 排除用户自己创建的创意 AND v.id IS NULL; -- 筛选出当前用户未投票的创意
说明:
- 把
v.voter_id = auth.uid()放在ON子句而非WHERE,是为了保留所有非用户创建的创意,未被该用户投票的创意会对应投票表的NULL值。 - 最后通过
v.id IS NULL筛选出用户未投票的记录,因为如果用户投过票,v.id会存在值。
方法二:NOT EXISTS 子查询
用子查询检查当前用户是否对创意投过票,直接筛选符合条件的创意:
SELECT id AS idea_id FROM Idea WHERE created_by != auth.uid() -- 排除自己创建的创意 AND NOT EXISTS ( SELECT 1 FROM Votes WHERE Votes.idea_id = Idea.id AND Votes.voter_id = auth.uid() -- 检查当前用户是否投过该创意 );
说明:
NOT EXISTS会判断子查询是否有结果,没有结果则说明当前用户未对该创意投票,符合需求。- 这种写法逻辑更直观,性能在多数数据库中也有良好表现。
内容的提问来源于stack exchange,提问作者Kirency
相关产品推荐
相关产品推荐

