警告: 私は mysql の人ではありませんが、TSQL の人です。最初に、条件付き更新ステートメントの 1 つの一般的なロジックに関するコメント: 特定の値について「表示済み」を最初にチェックし、「表示済み」がその値でない場合は、その値に設定すると、必要。
つまり、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' および/または 'coalesce' を使用して、null 値が無視されないようにすることができます。IS NULL で OR を使用したり、null 以外のデフォルト値と合体したりすることで、関係なく null 値を強制的に更新できます。(あなたの特定の例では、デフォルト値0でcoalesceを使用すると、「trendingViews」列の以前のnull値を1に設定する効果があります。これは、1ずつインクリメントしているため、デフォルト値として0を使用するためですnull インスタンスの場合)。
例:
trendingViews = IF(viewed IS NULL = 1 OR viewed != '2012-05-21 00:00:00', 1, COALESCE(trendingViews, 0) + 1),
更新ステートメントの最初の行...「ビュー」を設定する部分は、「ビュー」という名前の列/フィールドの存在を確認することが目的なのか、それともその「views」列の値がnullではないかどうかを確認してください。null でないかどうかを確認し、その場合は 1 ずつ増やし、null の場合は 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