试图理解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 的行,然后检查 RecordMonth
和 RecordYear
中的值...
找到解释
如果第一个条件和第二个条件都为真,则 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/