我有一个名为“游戏”的表格。 在此表中有几个字段。相关领域是 USER1 用户2 第1轮 round2 round3
字段user1和user2是整数/ id,当然是从“user”表中获取的(id和name作为字段)。
领域 第1轮 round2 round3 是从“问题”表中获取的整数/ ids。
现在我需要的是创建一个sql查询,它将从表“问题”中获取ID但仅包含那些尚未被用户使用的问题ID。
我的想法是制作类似的东西(当正在玩的用户的ID等于1和2时):
select from questions where id NOT IN (select round1 from questions where (user1 = 1 OR user1 = 2 OR user2 = 1 OR user2 = 2) )
我不确定此查询是否真的很好并且已经过优化。但是,它尚未完成。我实际上需要再添加2个WHERE标准,看起来就像上面的那个,round1被round2和round3取代。所以最后它看起来像:
select from questions
where id NOT IN (select round1 from questions where
(user1 = 1 OR user1 = 2 OR user2 = 1 OR user2 = 2) )
and id NOT IN (select round2 from questions where
(user1 = 1 OR user1 = 2 OR user2 = 1 OR user2 = 2) )
and id NOT IN (select round3 from questions where
(user1 = 1 OR user1 = 2 OR user2 = 1 OR user2 = 2) )
另外,我可能需要在round1 / round2 / round3之前添加“distinct”。
那么,您认为有更好的方法吗?提前谢谢。
答案 0 :(得分:0)
您可以使用UNION
select * from questions
where id NOT IN (
select distinct round1
from questions
where user1 in (1,2) OR user2 in (1,2)
UNION
select distinct round2
from questions
where user1 in (1,2) OR user2 in (1,2)
UNION
select distinct round3
from questions
where user1 in (1,2) OR user2 in (1,2)
)
答案 1 :(得分:0)
select * from questions
where ID not in (select round1 from games
union all
select round2 from games
union all
select round 3 from games)
这将返回游戏中未在round1或round2或round3字段中列出的所有问题。逻辑是使用查询来构建在游戏表中用作子查询的问题ID列表(我使用联合,因为你有3个字段),然后将其包含在where in()子句中
MySQL处理in()或不在()这样的子句中的位置非常差,我不建议将此逻辑用作正在进行的脚本...对于数据量较少的一次拍摄,它可以正常工作。
添加:在子选择中包含where子句(在每个联合中)以将其缩小到userID = 1或2
答案2:哪里不在()和哪里in()可以作为连接重写...而且它通常比在不在语句中的地方快得多(在MySQL中更是如此,这里的引擎确实如此)不处理where语句中的子选择)。当在相应的表中找不到任何内容时,左连接会产生空值
select q.*
from questions q
left join games g1 on g1.round1 = q.id
left join games g2 on g2.round2 = q.id
left join games g3 on g3.round3 = q.id
where g1.round1 is null and g2.round2 is null and g3.round3 is null
希望我说得对...你正在将问题加入到游戏桌中,当没有找到时,左连接会产生空值...
尝试一下,比较执行计划,看看性能如何。