2015-04-23 44 views
0

我有一个表,并具有下列数据获得最大的ID,如果有父ID,否则得到的所有结果

CREATE TABLE IF NOT EXISTS `tbl_ticket` (
    `id` int(9) NOT NULL AUTO_INCREMENT, 
    `parent_id` int(11) NOT NULL, 
    `ticket_title` varchar(250) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=16 ; 

-- 
-- Dumping data for table `tbl_ticket` 
-- 

INSERT INTO `tbl_ticket` (`id`, `parent_id`, `ticket_title`) VALUES 
(1, 0, 'tyty'), 
(2, 0, 'testing'), 
(3, 0, 'test from ticket'), 
(4, 0, 'test ticket'), 
(5, 0, 'test ticket'), 
(6, 0, 'test ticket'), 
(7, 0, 'test ticket'), 
(8, 5, 'test ticket'), 
(9, 0, '1 Ticket'), 
(10, 0, '2Ticket'), 
(11, 2, 'ticket2'), 
(12, 2, 'ticket1'), 
(13, 0, 'title 1234'), 
(14, 0, 'titles 1234'), 
(15, 14, 'sample 1234'); 

我需要返回所有行其中id是不存在于父表的ID。 另外,如果id存在于parent_id列中,我想要获得具有与parent_id匹配的最高id的行。 即我需要返回行id 1, 3,4,6,7,8,9,10, 12,13, 15

我想这SQL

SELECT `id` , `parent_id` 
FROM `tbl_ticket` 
WHERE id NOT 
IN (

SELECT parent_id 
FROM tbl_ticket 
) 

但它返回值11也,而是应该返回12这与parent_id =2

+1

为什么你的结果中有5个? 5在8 –

+0

的父字段中,这是一个错误,我删除了5.感谢您的通知。 – user7282

回答

1

假设在你的预期输出5具有最高的ID行是一个错字,因为5出现在的parent_id字段中,您可以通过union两个简单查询得到结果。

select t1.id 
    from tbl_ticket t1 
    where not exists (
     select 1 from tbl_ticket 
     where parent_id = t1.id 
    ) 
    and parent_id = 0 
union all 
    select max(id) 
    from tbl_ticket 
    where parent_id <> 0 
    group by parent_id 
order by id asc 

Fiddle here

该查询是在两个部分。第一部分获取所有不在另一个门票parent_id字段中的门票,并且它们本身没有父门(parent_id = 0)。

查询的第二部分查看具有父级(parent_id <> 0)的票证,并且对于共享相同parent_id的每个票证组,选择具有max id的票据。

然后将结果与union合并为一个结果集。由于两个结果集互斥,我们可以使用union all来跳过重复检查。

+0

如果你有时间可以解释sql吗? – user7282

0

如果我理解正确,可以使用not exists来做到这一点,而不是组合两个单独的查询。其优点是不需要消除重复的(当你使用union如需要):

select t.* 
from tbl_ticket t 
where not exists (select 1 
        from tbl_ticket t2 
        where t2.parent_id = t.id 
       ) or 
     not exists (select 1 
        from tbl_ticket t2 
        where t2.parent_id = t.id and t2.id > t.id 
       ); 

首先获取没有父母的所有行。第二个获取具有父代的最大ID的所有行。

为获得最佳性能,您需要tbl_ticket(parent_id, id)上的索引。

+0

当两半已经相互排斥时,工会中不需要重复排除。另外,当它不应该的时候,你的答案包括值'11'和'14'。 –

+0

@pala_。 。 。我遵循了文中的规则。 11在那里,因为“哪里id不在表中的父母id中”。 14号在那里,因为我误解了第二条规则(这是固定的)。 –

+0

但是,当parent_id不为零时,请选择具有该parent_id的最大ID,因此排除了11,并且包含12个 –