选择行在一个表(mysql)

时间:2015-12-23 11:34:48

标签: php mysql codeigniter mariadb

如何查询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)

4 个答案:

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