mysql - 使用 'NOT BETWEEN' 约束查询不同的记录列表

标签 mysql sql

我正在尝试构建一个查询,在对另一个表中的日期字段应用“NOT BETWEEN”约束后为我提供不同记录的列表。

鉴于以下...

User Table:
magicID    name
100        Greg
200        Fred

Event Table:
magicID    date
100        2011-02-24
100        2011-02-23
100        2011-02-22
200        2011-02-22

如何获取不属于特定日期范围内的不同用户的列表?我希望这是非常明确的。如果我正在寻找在 2011-02-23 和 2011-02-24 之间没有事件记录的用户,我希望得到一个结果,

200    Fred

这就是目标。但是下面的查询给了我所有用户。我希望“NOT BETWEEN”约束是明确的。

SELECT DISTINCT users.* FROM users, events WHERE events.date NOT BETWEEN '2011-02-23' AND '2011-02-24'

此查询返回所有用户...

100    Greg
200    Fred

我遗漏了一些非常基本的东西......

最佳答案

Because the values being compared will not be NULL, in MySQL the best performing option is the LEFT JOIN/IS NULL :

   SELECT u.magicid,
          u.name
     FROM USER u
LEFT JOIN EVENT e ON e.magicid = u.magicid
                 AND e.date BETWEEN '2011-02-23' AND '2011-02-24'
    WHERE e.magicid IS NULL

If the columns are nullable, NOT EXISTS is the better choice :

SELECT u.magicid,
       u.name
  FROM USER u
 WHERE NOT EXISTS (SELECT NULL
                     FROM EVENT e
                    WHERE e.magicid = u.magicid
                      AND e.date BETWEEN '2011-02-23' AND '2011-02-24')

关于mysql - 使用 'NOT BETWEEN' 约束查询不同的记录列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5110954/

相关文章:

mysql - 如何使用mysql将服务器时间插入数据库

sql - 在SQL中将INT转换为FLOAT

php - 在 PHP 和 SQL 中查看产品时遇到问题

mysql - 与 SQL 中的相关子查询作斗争

mysql - 未定义序列

java - Sonar runner (ubuntu) 执行失败 : com. mysql.jdbc.Driver

javascript - 如何使用jsp将mysql字符串存储在javascript变量中

MySQL SELECT 查询 - 一个单元格到多行

sql - PostgreSQL 触发器在使用外键插入表 A 后插入表 B

mysql - 需要按照 "in"函数中输入的顺序进行 sql 查询的结果集,无需任何创建和插入