【问题标题】:Select rows does not match in one table(mysql)选择的行在一个表中不匹配(mysql)
【发布时间】:2015-12-23 11:34:48
【问题描述】:

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

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

在 mysql 中这将选择 user_ids

我想要的是选择他们没有任何记录的 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)中的东西

【问题讨论】:

  • month NOT BETWEEN '201510' and '201601'
  • 如果我只有一个月呢?
  • !&gt;= 是不允许的,但请记住 not greater than or equal 基本上是 less than 所以试试 &lt; 或者你的意思是 not equal 这将是 !=

标签: php mysql codeigniter mariadb


【解决方案1】:

只需使用NOT BETWEEN-

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

如果是一个值 -

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

【讨论】:

  • 如果我只有一个月呢?在那种情况下,我不能使用 BETWEEN
【解决方案2】:

试试这个:

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

【讨论】:

    【解决方案3】:

    另一种解决方案:

    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'
    

    【讨论】:

      【解决方案4】:

      您需要明确检查列的 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
      

      【讨论】:

        猜你喜欢
        • 2012-12-25
        • 1970-01-01
        • 2012-01-06
        • 2012-10-09
        • 1970-01-01
        • 2015-07-18
        • 2012-03-19
        • 2012-07-30
        相关资源
        最近更新 更多