首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有多个值和列的MySQL和OR。尝试理解MySQL逻辑

问具有多个值和列的MySQL和OR。尝试理解MySQL逻辑
EN

Stack Overflow用户
提问于 2013-07-04 20:12:17
回答 2查看 113关注 0票数 0

尝试理解MySQL逻辑

代码语言:javascript
复制
| RecordDay | RecordMonth | RecordYear
----------------------------------------
  02        |   04        |   2013    
  03        |   05        |   2014
  04        |   06        |   2015

我的逻辑。如果我想查看除RecordDay = 02、RecordMonth = 04和RecordYear = 2013的记录之外的所有记录(不希望看到日期为02的记录,2013年4月2日),我会编写类似WHERE CAST(RecordDay AS UNSIGNED) != ? AND CAST(RecordMonth AS UNSIGNED) != ? AND CAST(RecordYear AS UNSIGNED) != ?的查询。例如,如果我想查看,我会用=编写相同的查询。For =查询起作用,但for !=不行。

现在理解查询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的行,然后检查RecordMonth和RecordYear中的值...

找到解释

同样的The AND operator displays a record if both the first condition AND the second condition are true.应该是The AND operator **does not** display a record if both the first condition AND the second condition are true.

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

如何使用> REGEXP-contains?

在我的脑海里一团糟...

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-04 21:07:30

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

提取所有数据很简单。

代码语言:javascript
复制
SELECT RecordDay, RecordMonth, RecordYear
  FROM t

忘了选角吧。MySQL知道该怎么做。

然后,假设您只想包含2013年的记录。你可以这么做。

代码语言:javascript
复制
SELECT RecordDay, RecordMonth, RecordYear
  FROM t
 WHERE RecordYear = 2013

很简单。

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

代码语言:javascript
复制
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

代码语言:javascript
复制
SELECT RecordDay, RecordMonth, RecordYear
  FROM t
 WHERE NOT (
                 RecordYear = 2013
             AND RecordMonth = 4
             AND RecordDay = 2
            )

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

代码语言:javascript
复制
  NOT (a AND b AND c)

可以转换为

代码语言:javascript
复制
 (NOT a) OR (NOT b) OR (NOT c)

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

代码语言:javascript
复制
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

代码语言:javascript
复制
SELECT RecordDay, RecordMonth, RecordYear
  FROM t
 WHERE RecordYear != 2013
    OR RecordMonth != 4
    OR RecordDay != 2

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

在本质上,SQL语言的WHERE部分是一个用于操作行集的布尔表达式引擎。有各种各样的方法来编写布尔表达式,其中许多都是在SQL中工作的。

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

注意这一小段SQL代码。

代码语言:javascript
复制
SELECT CAST(CONCAT_WS('-', RecordYear,RecordMonth,RecordDay) AS DATE) RecordDate

这会将离散的日/月/年日期表示转换为DATE对象,这对于从最新到最早的日期排序之类的各种事情都非常方便……

代码语言:javascript
复制
 ORDER BY RecordDate DESC

你可以做日期算术。例如,您可以获取4月2日之前的8天的记录,如下所示。http://sqlfiddle.com/#!2/c75d6/13/0

代码语言:javascript
复制
 WHERE RecordDate >= '2013-04-02' - INTERVAL 8 DAY
   AND RecordDate <= '2013-04-02'
票数 2
EN

Stack Overflow用户

发布于 2013-07-04 21:07:10

如果颠倒逻辑,您将需要or而不是and,或者您可以使用not来颠倒整个表达式。

因此,您可以使用比较来查看行是否与日期匹配,然后使用NOT来获取所有其他行,而不是那些行。

代码语言:javascript
复制
WHERE NOT (day = 2 AND month = 4 AND year = 2013)

这基本上是*)相同于:

代码语言:javascript
复制
WHERE day != 2 OR month != 4 OR year != 2013

毕竟,只要日、月、年不同,就不再是2013年4月2日了。一旦日、月、年与日期的值匹配,它就是那个日期,否则就不是。因此,在自然语言中,你也可以看到and和or之间的区别,只要你在描述中非常精确,而我们人类通常不是这样的,因为我们通过上下文理解的大部分含义。

布尔逻辑实际上是程序员无法与“正常”人交流的主要原因之一。;)

*)当涉及到包含任何值的NULL的行时,情况并不完全相同,但这完全是另一回事。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17470017

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档