警告:我不是 mysql 人,而是 TSQL 人。首先,对您的一个条件更新语句的一般逻辑进行评论:当您第一次检查“已查看”以获取特定值时,如果“已查看”不是该值,则将其设置为该值,您比必要的。
我的意思是,如果您知道您希望 ID 为 3024 的所有记录对“已查看”列具有相同的时间戳,然后,首先检查列中的任何值并仅更新那些不匹配的值,不需要,额外的工作也是如此。如果您的意图是所有“已查看”(其中 Id = '3024')都应设置为“2012-05-21 00:00:00”,那么只需将它们设置为该值。无需考虑它们的原始价值是什么......你不在乎。
所以而不是:
viewed = IF(viewed != '2012-05-21 00:00:00', '2012-05-21 00:00:00', viewed)
您将拥有:
viewed = '2012-05-21 00:00:00'
其次,您可以在 if 语句中使用“或”和/或“合并”,这样空值就不会被忽略。通过将 OR 与 IS NULL 结合使用和/或与非空默认值合并,您可以强制更新任何空值。(在您的特定示例中,使用默认值为 0 的合并,将具有将“trendingViews”列中的先前空值设置为 1 的效果,因为您递增 1,并且您将使用 0 作为默认值对于空实例。)
例子:
trendingViews = IF(viewed IS NULL = 1 OR viewed != '2012-05-21 00:00:00', 1, COALESCE(trendingViews, 0) + 1),
更新语句的第一行...设置“视图”的部分让我感到困惑,因为我不知道您的意图是检查名为“视图”的列/字段是否存在,或者您是否试图检查该“视图”列中的值是否为非空。如果您的目标是检查它是否不为空,然后在这种情况下将其增加 1,如果它为空,则将其设置为 1,那么可以这样做:
views = IF(views IS NULL != 1, views + 1, 1),
所以这是我要测试的整个语句(在 MYSQL 中):
UPDATE company SET
views = IF(views IS NULL = 0, views + 1, 1),
trendingViews = IF(viewed IS NULL = 1 OR viewed != '2012-05-21 00:00:00', 1, COALESCE(trendingViews, 0) + 1),
viewed = '2012-05-21 00:00:00'
WHERE id = '3024';
请记住,我不使用 MYSQL .... 没有测试过这些 MYSQL 更改。如果我在 TSQL 中执行此操作,则以下语句将起作用:
UPDATE company SET
[views] = (CASE WHEN [views] IS NOT NULL THEN [views] + 1 ELSE 1 END),
trendingViews = CASE WHEN viewed IS NULL OR viewed != '2012-05-21 00:00:00' THEN 1 ELSE COALESCE(trendingViews, 0) + 1 END,
viewed = '2012-05-21 00:00:00'
WHERE id = '3024';
go