2015-07-21 157 views
0

我有一個表叫票:獲取父行與兒童和條件

ticket (idTicket, title , message , parentTicket, lastdate, status) 

狀態得到了默認值:開,一旦我(MOD)回覆設置爲回答

我想得到與狀態打開(新創建和最後一次用戶回覆)

示例有效票的意思是:

13 , 'Title 1' , 'msg Title1' , NULL , 'open' 
14 , 'Title 2' , 'msg Title2' , NULL , 'open' 
15 , 'reply Title 2' , 'reply msg Title2' , 14 , 'replied' 
16 , 'Title 3' , 'msg Title3' , NULL ,'open' 
17 , 'reply Title 3' , 'reply msg Title3' , 16 , 'replied' 

也不馬利我應該只列出票號13

我的2個查詢的想法,但沒有運氣

1/

SELECT * 
FROM ticket AS parent LEFT JOIN 
    ticket AS child 
    ON child.parentTicket = parent.idTicket 
WHERE parent.parentTicket IS NULL and child.status ="open" 
ORDER BY parent.idTicket, child.idTicket; 

2/

Select t1.idTicket ,t2.parentTicket 
from ticket t1 inner join 
    ticket t2 
    on (t1.idTicket != t2.parentTicket) 
where t1.status ="open" and t2.parentTicket is null 
Group by idTicket 

3/

Select a.idTicket ,a.titleTicket,a.parentTicket 
from ticket a 
where not exists (select null from ticket b where a.parentTicket!=b.parentTicket) 
and a.status='open' 

回答

1

要返回未打開的「根」門票有任何兒童票......也就是從ticket行有NULLparentTicket,並具有status='open',併爲其中兒童票不存在,你可以使用一個反連接模式:

SELECT p.* 
    FROM ticket p 
    LEFT 
    JOIN ticket c 
    ON c.parentTicket = p.idTicket 
    WHERE p.parentTicket IS NULL 
    AND p.status = 'open' 
    AND c.parentTicket IS NULL 

反連接是外連接,在WHERE子句中有一個謂詞,它排除了具有匹配的行。這基本上是說讓所有打開的「根」票,以及任何匹配的子行。技巧是最後一個謂詞,c.parentTicket IS NULL ...任何匹配的子行都保證有非空值(由於JOIN謂詞),所以這排除了任何有匹配子行的行。

這相當於一個帶有NOT EXISTS (subquery)謂詞的查詢。這也許是比較容易理解:

SELECT p.* 
    FROM ticket p 
    WHERE p.parentTicket IS NULL 
    AND p.status = 'open' 
    AND NOT EXISTS 
     (SELECT 1 
      FROM ticket c 
      WHERE c.parentTicket = p.idTicket 
     ) 
; 

這兩個查詢將返回一行idTicket=13

SQL Fiddle demonstration here: http://sqlfiddle.com/#!9/393b7/1

但是...而這些查詢返回指定的行,足以爲在這個問題提供的樣本數據,我不認爲這符合該規範的全部。在關於「最後用戶回覆」的問題中有一點,但除此之外,規範相當稀疏。沒有示例數據說明哪些行應該(並且不應該)返回。如果有多個回覆或回覆回覆,回覆狀態以及作者身份等情況怎麼辦?

或者,這些查詢可能足夠了,或者至少足以讓您領先正確的方向。

+0

謝謝斯賓塞,其實我弄明白了,但有一個小錯誤,這裏是:13,'Title 1','msg Title1',NULL,'open' 14,'Title 2',' msg Title2',NULL,'open' 15,'reply Title 2','reply msg Title2',14''回覆' 16,'Title 3','msg Title3',NULL,'open' 17, 'reply title 3','reply msg Title3',16''回覆' 18,'Title 4','msg title 4',Null,'open' 19,'reply title 3','msg reply title 3 ',16,'打開',通常它應該列出票證編號:13 18和16但只顯示13和18 – Krasic

+0

好吧我編輯了你的查詢,SELECT p。*,c.idTicket FROM票p LEFt JOIN票c ON c.parentTicket = p.idTicket 其中p.status =「打開」 AND c.parentTicket IS NULL ,但是最後一行不顯示根目錄ID ...(它是16)它顯示19 – Krasic