我有此数据:
id message_id recipient user_id area name 1 1754 0 95 1 Ruecker 2 1754 1 1 4 Heller 3 1754 2 2 1 Kuhn 4 1754 2 3 4 Schuster
我想获得user_id!= 1和area!= 4(不包括Heller)的结果。所以我想获取ID为:1、3、4的行。
我尝试了以下代码:
select * from `message_participants` where `message_id` = 1754 and (`user_id` != 1 and `area` != 4)
我只得到鲁克和库恩。 舒斯特也被排除在外。
有人可以解释原因吗?
(现在)我已经解决了该查询-但这似乎有点过头了:
select * from `message_participants` where `message_id` = 1754 and `id` NOT IN (select id from `message_participants` where `message_id` = 1754 and `user_id` = 1 and `area` = 4)
答案 0 :(得分:2)
您可以将def as_json(options = {})
super(options.merge(include: :bank))
end
用作
not in()
或者可以使用大小写表达式
select * from
`message_participants`
where `message_id` = 1754
and (`user_id` ,`area`) not in((1,4));
答案 1 :(得分:1)
舒斯特(Schuster)之所以也被排除在外的原因是,它的面积= 4,而您在声明area != 4
的行中将其排除。
( )
不会使查询按用户ID 1和区域4一起排序,它将对所有结果执行此操作。由于面积值,这又将Schuster选出。
这是使用or
为您提供的解决方案:
select * from `message_participants`
where `message_id` = 1754 and `user_id` != 1 or `area` != 4