Select 行在一个 table(mysql) 中不匹配

Select rows does not match in one table(mysql)

如何查询与我的查询不匹配的 mysql 和 select 行? 目前这是我的 sql 如果我想 select 匹配的行:

SELECT `user_id`
FROM `my_table`
WHERE `my_table`.`month` >= '201510'
AND `my_table`.`month` <= '201601'

在 mysql 这将 select user_ids

我想要的是 select user_ids 他们没有任何记录的地方, broken 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)

只需使用 NOT BETWEEN-

SELECT `user_id`
FROM `my_table`
WHERE `my_table`.`month` NOT BETWEEN '201510' AND '201601'

如果只有一个值 -

`my_table`.`month` <> '201510'

试试这个:

SELECT user_id
FROM my_table
WHERE month NOT BETWEEN '201510' AND '201601'

还有一个解决方案:

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'

您需要明确检查该列是否存在 NULL 值

SELECT *
FROM `my_table`
WHERE `my_table`.`month` NOT BETWEEN '201510' AND '201601'
   OR `my_table`.`month` IS NULL

因为每次与 NULL 值的比较都会 return NULL。 NULL 既不是 TRUE 也不是 FALSE。

您的问题的一般答案

select rows which does not match my query

封装您的查询并在 '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