我有一张桌子并且有以下数据
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的所有行。
此外,如果parent_id列中存在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
答案 0 :(得分:1)
假设预期输出中的5
是拼写错误,5
字段显示parent_id
id=8
,您可以通过{{1}获得结果两个简单的查询。
union
查询分为两部分。第一部分获取在另一个故障单parent_id字段中不存在的所有故障单,并且它们本身没有父设备(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
)。
查询的第二部分查看具有父级(parent_id = 0
)的那些故障单,并且对于共享相同parent_id <> 0
的每组故障单,选择具有{{1}的故障单。 id。
然后将结果与parent_id
组合以提供单个结果集。由于这两个结果集是互斥的,我们可以使用max
跳过重复检查。
答案 1 :(得分: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)
上的索引。