我有一张桌子,有以下数据
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
ID为最高的行parent_id =2
假设5
预期输出中的是错字(如5
的parent_id
字段中所示)id=8
,则可以通过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
该查询分为两个部分。第一部分获得了所有票证,这些票证不在另一个票证的parent_id字段中,并且它们本身没有父票证(parent_id = 0
)。
查询的第二部分查看那些具有父代(parent_id <> 0
)的票证,并为每个共享同一票证的组parent_id
选择具有max
ID的票证。
然后将结果与组合union
以给出单个结果集。由于两个结果集是互斥的,因此我们可以使用union all
跳过重复检查。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句