2012-04-30 23 views
0

我用這個查詢返回我一些信息:SQL - 顯示什麼,如果條件得不到尊重

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 

我選擇3倍swticketauditlogs表,因爲,我查詢的每一行,我需要三乘以表中的同一列,但是具有其他條件。

我的問題是,對於此代碼,如果表swticketauditlogs上的三個條件之一未被遵守,則不會選中該故障單。我想要的是:

票證被選中,並且條件不成立的字段爲空。

但我想不出如何做到這一點?

感謝您的幫助。

回答

0

你想用LEFT JOIN S:

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 

左聯接產生右表中的列空,如果連接不成功。 (請注意,這些的空值,而不是「空白」 - 無論這可能是什麼意思)。

+0

我認爲這是圍繞左加入,但我使用它有困難。非常感謝! – HerrM

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

+0

我認爲這是左邊的連接,但我有使用它的困難。非常感謝! – HerrM

1

你想用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 
+0

我認爲這是左邊的連接,但我有使用它的困難。非常感謝! – HerrM

1

使用LEFT JOIN S:

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 
+0

我認爲這是左邊的連接,但我有使用它的困難。非常感謝! – HerrM