如何查询mysql并选择与我的查询不匹配的行? 目前这是我的sql如果我想选择匹配的行:
SELECT `user_id`
FROM `my_table`
WHERE `my_table`.`month` >= '201510'
AND `my_table`.`month` <= '201601'
在mysql中,这将选择user_ids
我想要的是选择没有任何记录的user_ids,破解 sql将是:
SELECT `user_id`
FROM `my_table`
WHERE `my_table`.`month` !>= '201510'
AND `my_table`.`month` !<= '201601'
更清楚,执行逻辑操作的mongo has a nice $not variable,我想要的东西就像$ not而不是mysql(或mariadb)
答案 0 :(得分:4)
只需使用NOT BETWEEN
-
SELECT `user_id`
FROM `my_table`
WHERE `my_table`.`month` NOT BETWEEN '201510' AND '201601'
如果有一个值 -
`my_table`.`month` <> '201510'
答案 1 :(得分:0)
试试这个:
SELECT user_id
FROM my_table
WHERE month NOT BETWEEN '201510' AND '201601'
答案 2 :(得分:0)
还有一个解决方案:
SELECT `user_id`
FROM `my_table`
WHERE `my_table`.`month` < '201510'
AND `my_table`.`month` > '201601'
这相当于( @sougata 回答):
SELECT `user_id`
FROM `my_table`
WHERE `my_table`.`month` NOT BETWEEN '201510' AND '201601'
答案 3 :(得分:0)
您需要明确检查列的NULL值
SELECT *
FROM `my_table`
WHERE `my_table`.`month` NOT BETWEEN '201510' AND '201601'
OR `my_table`.`month` IS NULL
因为每个与NULL值的比较都将返回NULL。并且NULL既不是TRUE也不是FALSE。
您问题的一般答案
选择与我的查询不匹配的行
封装您的查询并在'NOT IN'子句中使用它
SELECT `user_id`
FROM `my_table`
WHERE `user_id` NOT IN (
SELECT `user_id`
FROM `my_table`
WHERE `my_table`.`month` >= '201510'
AND `my_table`.`month` <= '201601'
)
但这通常效率低下。
令人惊讶的是,有一种方法可以反转条件,即NULL将转换为TRUE:
IF (condition, 0, 1)
所以您的查询可能看起来像
SELECT `user_id`
FROM `my_table`
WHERE IF((`my_table`.`month` >= '201510' AND `my_table`.`month` <= '201601'), 0, 1)
它也适用于
CASE WHEN condition THEN 0 ELSE 1 END