2012-06-28 40 views
1

假设我们有字段:id |内容| updateTime | creationTime带有条件的SQL查询,其中一个字段不等于另一个字段

插入完成后,updateTime和creationTime都会被当前时间填充。在更新时,只有updateTime字段被更改。当我需要找到上创建的所有数据“2012-06-28”我简单地使用:

SELECT id, content FROM tbl WHERE creationTime LIKE '2012-06-28%'` 

但要获得不包括创建的数据已更新,我需要使用像这样的所有数据:

SELECT id, content FROM tbl WHERE creationTime LIKE '2012-06-28%' AND creationTime != updateTime 

这显然不起作用。虽然我可以通过比较php内两个'时间'collumns的值来找到所有更新的数据,但我仍然喜欢在查询内部完成它。

UPD:嗯,事实证明,我完全没有意识到,sql不仅允许将字段的值与给定变量,数字进行比较......还可以将一个字段的值与另一个字段的值进行比较。

+0

创建于28日,并在28日编辑,但不是在创建它的同时?在更新之前保持updateTime为null会更好吗? –

+0

为什么你说“*这不能工作,显然*”?我认为它应该,虽然我同意@marabutt认为'updateTime = NULL'可能更符合语义。 (另外,为了匹配日期,你会发现'DATE(creationTime)='2012-06-28''会比你的字符串模式匹配方法更有效率)。 – eggyal

+0

@marabutt - INSERT每行只发生一次,UPDATE可能发生多次。所以我只是使用'updateTime'时间戳NOT NULL default CURRENT_TIMESTAMP - 这种方式'updateTime'由DB本身自动更新。我只需要记住在创建记录时插入日期。 –

回答

5

使用<>代替!=(即不与一些DMBS兼容)

所以

SELECT id, content 
FROM tbl 
WHERE creationTime LIKE '2012-06-28%' AND creationTime <> updateTime 

如果你想要一些文档you can find here

然而,查询必须与!=正常工作

+0

@Hallucynogenyc:看看他使用的标签 – DonCallisto

+0

抱歉,从来没有用过mySQL,只是PostgreSQL,你怎么知道的? :) – bluehallu

+0

您链接到的文档表明'<>'和'!='是有效的不等式运算符。为什么你提出的改变会有所作为? – eggyal

1

只将非运算符从!=更改为<>

SELECT id, content FROM tbl WHERE creationTime LIKE '2012-06-28%' AND creationTime <> updateTime 
+0

不支持这两种形式的不等式运营商? – eggyal

2

您所查询的是正确的(上mySQL¹),不知道为什么你会认为否则

¹<>是不相等的SQL操作。它的一些实现(例如PostgreSQL或MySQL)也接受!=。如果您曾在不同的数据库上使用您的代码,那么始终使用<>以避免问题是一种很好的做法。

+0

不支持这两种形式的不等式运算符吗? – eggyal

+0

SQL规范与当今存在的实现之间存在差异。 MySQL可能支持不符合规范但不适用于其他SQL编译数据库的内容。 – bluehallu

+0

同意,但考虑到这个问题被标记为[tag:mysql],这是如何回答OP的问题? – eggyal

相关问题