【问题标题】:SQL - display nothing if a condition isn't respectedSQL - 如果不遵守条件,则不显示任何内容
【发布时间】:2023-03-09 20:00:02
【问题描述】:

我使用此查询返回一些信息:

select tick.ticketid 'Ticket', tick.subject 'Sujet', FROM_UNIXTIME(tick.dateline)     'Reception', FROM_UNIXTIME(logs1.dateline) 'Verification', FROM_UNIXTIME(logs2.dateline)     'Debut trait.',
FROM_UNIXTIME(logs3.dateline) 'Fin trait.', tick.prioritytitle 'Priorite',  tick.tickettypetitle 'Genre', tick.timeworked/60 'Temps de travail', tick.fullname  'Createur'
from swtickets tick, swticketauditlogs logs1, swticketauditlogs logs2, swticketauditlogs logs3
where tick.ticketid = logs1.ticketid 
and tick.ticketid = logs2.ticketid
and tick.ticketid = logs3.ticketid
and logs1.actionmsg like '%to: Pre-analysis%'
and (logs2.actionmsg like '%to: Handled%' or logs2.actionmsg like '%to: In Progress%')
and (logs3.actionmsg like '%to: Pre-closed%' or logs3.actionmsg like '%to: Closed%')
group by tick.ticketid

我选择了 swticketauditlogs 表的 3 倍,因为对于我的查询的每一行,我需要三倍于表的同一列但有其他条件。

我的问题是,使用此代码,如果不遵守表 swticketauditlogs 上的三个条件之一,则不会选择票证。我想要的是:

工单被选中,未遵守条件的字段为空白。

但我不知道该怎么做……

感谢您的帮助。

【问题讨论】:

    标签: mysql select conditional-statements


    【解决方案1】:

    你必须用显式LEFT JOINs替换你的隐式连接:

    ...
    FROM swtickets tick
    LEFT JOIN swticketauditlogs logs1
           ON (     logs1.ticketid = tick.ticketid
                AND logs1.actionmsg LIKE '%to: Pre-analysis%'
              )
    LEFT JOIN swticketauditlogs logs2
           ON 
    ...
    

    如果找到记录,则返回值,否则您选择的列是NULL

    【讨论】:

    • 我认为它在左连接附近,但我在使用它时遇到了困难。非常感谢!
    【解决方案2】:

    您想使用outer joins(不会从其他表中消除不匹配的行):

    SELECT
      tick.ticketid                 AS `Ticket`,
      tick.subject                  AS `Sujet`,
      FROM_UNIXTIME(tick.dateline)  AS `Reception`,
      FROM_UNIXTIME(logs1.dateline) AS `Verification`,
      FROM_UNIXTIME(logs2.dateline) AS `Debut trait.`,
      FROM_UNIXTIME(logs3.dateline) AS `Fin trait.`,
      tick.prioritytitle            AS `Priorite`,
      tick.tickettypetitle          AS `Genre`,
      tick.timeworked/60            AS `Temps de travail`,
      tick.fullname                 AS `Createur`
    FROM
      swtickets AS tick
      LEFT JOIN swticketauditlogs AS logs1 ON (
             logs1.ticketid = tick.ticketid
        AND  logs1.actionmsg LIKE '%to: Pre-analysis%'
      )
      LEFT JOIN swticketauditlogs AS logs2 ON (
             logs2.ticketid = tick.ticketid
        AND (logs2.actionmsg LIKE '%to: Handled%'
         OR  logs2.actionmsg LIKE '%to: In Progress%')
      )
      LEFT JOIN swticketauditlogs AS logs3 ON (
             logs3.ticketid = tick.ticketid
        AND (logs3.actionmsg LIKE '%to: Pre-closed%'
         OR  logs3.actionmsg LIKE '%to: Closed%')
      )
    GROUP BY tick.ticketid
    

    【讨论】:

    • 我以为它在左连接附近,但我在使用它时遇到了困难。非常感谢!
    【解决方案3】:

    使用LEFT JOINs:

    select ...
    from swtickets tick
    left join swticketauditlogs logs1 on tick.ticketid = logs1.ticketid and logs1.actionmsg like '%to: Pre-analysis%'
    left join swticketauditlogs logs2 on tick.ticketid = logs2.ticketid and (logs2.actionmsg like '%to: Handled%' or logs2.actionmsg like '%to: In Progress%')
    left join swticketauditlogs logs3 on tick.ticketid = logs3.ticketid and (logs3.actionmsg like '%to: Pre-closed%' or logs3.actionmsg like '%to: Closed%')
    group by tick.ticketid
    

    【讨论】:

    • 我以为它在左连接附近,但我在使用它时遇到了困难。非常感谢!
    【解决方案4】:

    你想使用LEFT JOINs:

    select tick.ticketid 'Ticket', tick.subject 'Sujet', FROM_UNIXTIME(tick.dateline)     'Reception', FROM_UNIXTIME(logs1.dateline) 'Verification', FROM_UNIXTIME(logs2.dateline)     'Debut trait.',
    FROM_UNIXTIME(logs3.dateline) 'Fin trait.', tick.prioritytitle 'Priorite',  tick.tickettypetitle 'Genre', tick.timeworked/60 'Temps de travail', tick.fullname  'Createur'
    from
    swtickets tick
        left join
    swticketauditlogs logs1
        on
          tick.ticketid = logs1.ticketid and
          logs1.actionmsg like '%to: Pre-analysis%'
        left join
    swticketauditlogs logs2
        on
          tick.ticketid = logs2.ticketid and
          (logs2.actionmsg like '%to: Handled%' or logs2.actionmsg like '%to: In Progress%')
        left join
    swticketauditlogs logs3
        on
          tick.ticketid = logs3.ticketid and
          (logs3.actionmsg like '%to: Pre-closed%' or logs3.actionmsg like '%to: Closed%')
    group by tick.ticketid
    

    如果连接不成功,左连接会在右表的列中产生空值。 (请注意,这些 空值,而不是“空白”——不管这可能意味着什么)。

    【讨论】:

    • 我以为它在左连接附近,但我在使用它时遇到了困难。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 2023-03-21
    相关资源
    最近更新 更多