尝试理解MySQL逻辑
| 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?
在我的脑海里一团糟...
发布于 2013-07-04 21:07:30
这里有一些关于如何处理日期信息的建议。
提取所有数据很简单。
SELECT RecordDay, RecordMonth, RecordYear
FROM t忘了选角吧。MySQL知道该怎么做。
然后,假设您只想包含2013年的记录。你可以这么做。
SELECT RecordDay, RecordMonth, RecordYear
FROM t
WHERE RecordYear = 2013很简单。
现在,假设您希望包含年/月/day = 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
)现在,根据布尔代数的规则,您可以对表达式进行简单的转换。亚里士多德,奥卡姆的威廉和DeMorgan发现了这一点。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部分是一个用于操作行集的布尔表达式引擎。有各种各样的方法来编写布尔表达式,其中许多都是在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日之前的8天的记录,如下所示。http://sqlfiddle.com/#!2/c75d6/13/0
WHERE RecordDate >= '2013-04-02' - INTERVAL 8 DAY
AND RecordDate <= '2013-04-02'发布于 2013-07-04 21:07:10
如果颠倒逻辑,您将需要or而不是and,或者您可以使用not来颠倒整个表达式。
因此,您可以使用比较来查看行是否与日期匹配,然后使用NOT来获取所有其他行,而不是那些行。
WHERE NOT (day = 2 AND month = 4 AND year = 2013)这基本上是*)相同于:
WHERE day != 2 OR month != 4 OR year != 2013毕竟,只要日、月、年不同,就不再是2013年4月2日了。一旦日、月、年与日期的值匹配,它就是那个日期,否则就不是。因此,在自然语言中,你也可以看到and和or之间的区别,只要你在描述中非常精确,而我们人类通常不是这样的,因为我们通过上下文理解的大部分含义。
布尔逻辑实际上是程序员无法与“正常”人交流的主要原因之一。;)
*)当涉及到包含任何值的NULL的行时,情况并不完全相同,但这完全是另一回事。
https://stackoverflow.com/questions/17470017
复制相似问题