具有多个值和列的 MySQL AND OR。试图理解 MySQL 逻辑

标签 mysql

试图理解MySQL逻辑

| RecordDay | RecordMonth | RecordYear
----------------------------------------
  02        |   04        |   2013    
  03        |   05        |   2014
  04        |   06        |   2015

我的逻辑。如果我想查看除 RecordDay = 02 和 RecordMonth = 04 和 RecordYear = 2013 以外的所有记录(不想查看记录日期是 2013 年 4 月 2 日),我写的查询像 WHERE CAST(RecordDay AS UNSIGNED) != ? AND CAST(RecordMonth AS UNSIGNED)!=? AND CAST(RecordYear AS UNSIGNED) != ?.如果我想查看,我会使用 = 编写相同的查询。对于 = 查询有效,但对于 != 无效。

现在了解 MySQL 的查询遍历列和行并排除 RecordDay = 02、RecordMonth = 04、RecordYear = 2013. 通过查询,我好像告诉我不想在什么地方看到结果...

看到这个查询 WHERE (CAST(RecordDay AS UNSIGNED) != ? OR CAST(RecordMonth AS UNSIGNED) != ? OR CAST(RecordYear AS UNSIGNED) != ?) 有效。但是不明白为什么会这样。

MySQL 是做什么的?遍历列和行,找到 RecordDay = 02 的行,然后检查 RecordMonthRecordYear 中的值...

找到解释

如果第一个条件和第二个条件都为真,则 AND 运算符显示一条记录。 AND 运算符**不**显示一条记录,如果第一个条件和第二个条件都为真。

如果第一个条件或第二个条件为真,则 OR 运算符显示一条记录。

> REGEXP - 包含什么?

脑子里一片困惑....

最佳答案

这里有一些关于如何处理您的日期信息的建议。

提取所有数据很简单。

SELECT RecordDay, RecordMonth, RecordYear
  FROM t

忘掉类型转换吧。 MySQL 知道这样做。

然后,假设您只想包括 2013 年的记录。您这样做。

SELECT RecordDay, RecordMonth, RecordYear
  FROM t
 WHERE RecordYear = 2013

简单。

现在,假设您想要包含年/月/日 = 2013/4/2 的记录。您可以使用 WHERE/AND 来执行此操作,因为您希望选择记录需要满足的所有条件。

SELECT RecordDay, RecordMonth, RecordYear
  FROM t
 WHERE RecordYear = 2013
   AND RecordMonth = 4
   AND RecordDay = 2

从您的表中获取一条记录。看这里。 http://sqlfiddle.com/#!2/c75d6/14/0

接下来,您要排除而不是包含满足所有这三个条件的记录(WHERE ... AND ... AND ...) 这点逻辑就可以了。 http://sqlfiddle.com/#!2/c75d6/15/0

SELECT RecordDay, RecordMonth, RecordYear
  FROM t
 WHERE NOT (
                 RecordYear = 2013
             AND RecordMonth = 4
             AND RecordDay = 2
            )

现在,根据 bool 代数的规则,你可以对表达式进行简单的变换。亚里士多德、奥卡姆的威廉和德摩根发现了这一点。 http://en.wikipedia.org/wiki/De_Morgan%27s_laws .例如

  NOT (a AND b AND c)

可以转化为

 (NOT a) OR (NOT b) OR (NOT c)

在SQL中,就是这样写的。参见 http://sqlfiddle.com/#!2/c75d6/16/0

SELECT RecordDay, RecordMonth, RecordYear
  FROM t
 WHERE NOT(RecordYear = 2013)
    OR NOT(RecordMonth = 4)
    OR NOT(RecordDay = 2)

最后,我们可以将 NOT(RecordYear = 2013) 重写为 RecordYear != 2013。这样做我们得到这个:http://sqlfiddle.com/#!2/c75d6/17/0

SELECT RecordDay, RecordMonth, RecordYear
  FROM t
 WHERE RecordYear != 2013
    OR RecordMonth != 4
    OR RecordDay != 2

也就是说,选择满足这三个不等式条件中的一个或多个的任意行。

从本质上讲,SQL 语言的 WHERE 部分是一个用于操作行集的 bool 表达式引擎。 bool 表达式的编写方式有很多种,其中很多都适用于 SQL。

最后,请考虑使用真实日期。 SQL 有很多好东西可以处理它们。参见 http://sqlfiddle.com/#!2/c75d6/9/0

注意这一点 SQL 代码。

SELECT CAST(CONCAT_WS('-', RecordYear,RecordMonth,RecordDay) AS DATE) RecordDate

这会将离散的日/月/年日期表示形式转换为 DATE 对象,这对于各种事情来说真的非常方便,例如从最新到最早的顺序日期...

 ORDER BY RecordDate DESC

你可以做日期算术。例如,您可以像这样获取从 4 月 2 日开始的八天的记录。 http://sqlfiddle.com/#!2/c75d6/13/0

 WHERE RecordDate >= '2013-04-02' - INTERVAL 8 DAY
   AND RecordDate <= '2013-04-02'

关于具有多个值和列的 MySQL AND OR。试图理解 MySQL 逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17470017/

相关文章:

java - 在 JDBC 中将 MySQL 数据库的特定表复制到 MariaDB 数据库

php - 全文搜索不起作用

php - while循环中如何判断是否是最后一个?

python - 如何处理 scrapy 和 MySQL 中的撇号?蜘蛛完全忽略了数据中具有 "'“的内容

PHP显示错误

mysql - 在MySQL中使用存储过程时遇到两个问题

sql - 寻找一种方法来限制 SQL 结果每个特定列 3 个结果

PHP - 阻止用户访问 php 页面

jquery - 使用 MySQL 数据库中的数据通过 Flask 和 jQuery 填充下拉列表

MySQL按顺序将两个选择合二为一