首页 > 解决方案 > 两个 MYSQL TIMESTAMP 列的比较未提供正确结果

问题描述

我有 2 个表clientfollowup。我需要根据以下条件进行选择。

如果表 client t1 中的subscriber_id NOT IN后续表 t2 和 t1.paid_amount = 0 AND t1.update_balance > 200

或者

如果subscriber_id表后续t2 中,并且t1.paid_amount = 0 AND t1.update_balance > 200并且如果t1.update_time 大于t2.update_time。两个表中的 update_time 都是 MYSQL TIMESTAMP格式。

我目前的查询如下:

SELECT t1.id,t1.subscriber_id,t1.paid_amount,t1.update_balance
FROM client AS t1
LEFT OUTER JOIN followup AS t2 ON t1.subscriber_id = t2.subscriber_id
WHERE (t2.subscriber_id IS NULL AND t1.paid_amount = 0 AND t1.update_balance > 200) OR (t2.subscriber_id IS NOT NULL AND t1.paid_amount = 0 AND t1.update_balance > 200 AND 't1.update_time'> 't2.update_time')

但是如果 t1.update_time > THAN t2.update_time..则不会选择数据。

Client Table:
-------------------------------------------------------------------
id   subscriber_id  paid_amount    update_balance  update_time
--------------------------------------------------------------------
1     AB4567            0              500      2020-07-12 18:22:24
2.    AB4568            0              300      2020-07-15 17:22:24
--------------------------------------------------------------------

Followup Table
------------------------------------------------------------------
id   subscriber_id  feedback  update_time
-------------------------------------------------------------------
1.   AB4567          paid      2020-07-12 17:22:24 
-------------------------------------------------------------------
  1. 如果subscriber_id不在表 2 中 - 显示 ROW
  2. Ifsubscriber_id IN table 2 -如果 t1.update_time > t2.update_time 则显示

请求 MySQL 专家的帮助..

标签: mysql

解决方案


我不确定这是整个问题,但是

UNIX_TIMESTAMP('t1.update_time'> 't2.update_time')

应该

t1.update_time > t2.update_time

首先,比较时无需使用UNIX_TIMESTAMP,直接比较日期即可。

其次,您不应该引用列名。这使它们成为字符串文字。请参阅何时在 MySQL 中使用单引号、双引号和反引号

第三,如果你使用UNIX_TIMESTAMP,你需要在每一列上分别调用它,例如

UNIX_TIMESTAMP(t1.update_time) > UNIX_TIMESTAMP(t2.update_time)

您的代码正在比较字符串,其计算结果为TRUE,即1,所以它正在评估 UNIX_TIMESTAMP(1)

要使整个查询正常工作,请将其拆分为两个查询,并与UNION.

SELECT t1.id,t1.subscriber_id,t1.paid_amount,t1.update_balance
FROM client AS t1
LEFT OUTER JOIN followup AS t2 ON t1.subscriber_id = t2.subscriber_id
WHERE t1.paid_amount = 0 AND t1.update_balance > 200
AND t2.subscriber_id IS NULL

UNION 

SELECT t1.id,t1.subscriber_id,t1.paid_amount,t1.update_balance
FROM client AS t1
INNER JOIN followup AS t2 ON t1.subscriber_id = t2.subscriber_id AND t1.update_time > t2.update_time
WHERE t1.paid_amount = 0 AND t1.update_balance > 200

演示


推荐阅读