如何使用 IF 语句进行条件连接

时间:2021-03-16 21:28:14

标签: mysql sql

您将如何在需要过滤状态的表上执行内部联接,但对于其中一个状态值,我需要对 SQL phpmyadmin 执行额外的日期比较检查。

我有以下几点:

例如

INNER JOIN orders backup_orders
    ON backup_orders.bc_id = product_sold.order_id
    AND backup_orders.status_id NOT IN (0, 1, 4, 6, 13, 14)
    AND CONVERT_TZ( STR_TO_DATE( backup_orders.date_modified, "%a, %d %b %Y %T" ) , "GMT", "America/Chicago" )
        >= CONVERT_TZ(STR_TO_DATE(:previous_week_start, "%a, %d %b %Y %T") , "GMT", "America/Chicago")

这只会让我获得订单取消的记录,以及在 previous_week_start 之后取消的记录。我想要所有的记录,但如果状态为 5 被取消,则执行日期比较,如果它在日期之后被取消,则将其添加到结果中。

#编辑:

AND(backup_orders.status_id NOT IN (0,1,4,6,13,14) OR (backup_orders.status_id = 5 AND CONVERT_TZ( STR_TO_DATE( backup_orders.date_modified, '%a, %d %b %Y %T' ) , 'GMT', 'America/Chicago' ) >= CONVERT_TZ(STR_TO_DATE("Thu, 11 Mar 2021 22:00:00 +0000", '%a, %d %b %Y %T') , "GMT", "America/Chicago")))

2 个答案:

答案 0 :(得分:0)

您可以在 where 条件下使用 case:

INNER JOIN orders backup_orders
    ON backup_orders.bc_id = product_sold.order_id
    and backup_orders.status_id NOT IN (0, 1, 4, 6, 13, 14) 
    AND  (case when backup_orders.status_id =5 then
 CONVERT_TZ( STR_TO_DATE( backup_orders.date_modified, "%a, %d %b %Y %T" ) , "GMT", "America/Chicago" )
        >= CONVERT_TZ(STR_TO_DATE(:previous_week_start, "%a, %d %b %Y %T") , "GMT", "America/Chicago") end)

但是直接比较 backup_orders.status_id=5 而不是 backup_orders.status_id NOT IN (0, 1, 4, 6, 13, 14) 不是更好吗

答案 1 :(得分:0)

如果您检查编辑中的条件,则日期比较无关紧要...

AND
(
  backup_orders.status_id NOT IN (0,1,4,6,13,14)
  OR
  (
    backup_orders.status_id = 5
    AND
    CONVERT_TZ( STR_TO_DATE( backup_orders.date_modified, '%a, %d %b %Y %T' ) , 'GMT', 'America/Chicago' )
    >=
    CONVERT_TZ(STR_TO_DATE("Thu, 11 Mar 2021 22:00:00 +0000", '%a, %d %b %Y %T') , "GMT", "America/Chicago")
  )
)

如果 status_id 为 5,则第一个条件为 True; 5 是 NOT IN 那个列表。

那么,无论第 2 个或第 3 个条件是什么,TRUE OR (X AND Y) 的结果都是 True,无论 X 或 Y 是什么。

因此,您需要将 5 个添加到您的列表中...

AND
(
  backup_orders.status_id NOT IN (0,1,4,5,6,13,14) -- added 5 here
  OR
  (
    backup_orders.status_id = 5
    AND
    CONVERT_TZ( STR_TO_DATE( backup_orders.date_modified, '%a, %d %b %Y %T' ) , 'GMT', 'America/Chicago' )
    >=
    CONVERT_TZ(STR_TO_DATE("Thu, 11 Mar 2021 22:00:00 +0000", '%a, %d %b %Y %T') , "GMT", "America/Chicago")
  )
)

现在,如果日期比较也解析为 True,则状态 5 只能解析为 True。

(请原谅打字错误,我是在手机上做的。)