MySQL意外结果

时间:2018-07-05 13:15:47

标签: mysql

我有此数据:

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)

2 个答案:

答案 0 :(得分:2)

您可以将def as_json(options = {}) super(options.merge(include: :bank)) end 用作

not in()

Demo

或者可以使用大小写表达式

select * from 
`message_participants` 
where `message_id` = 1754 
and (`user_id` ,`area`) not in((1,4));

Demo

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