2015-07-21 161 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