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
如何查询与我的查询不匹配的 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