4

我正在使用 OTRS 帮助台工单管理系统。当我执行以下查询时:

SELECT  `ticket`.`id` ,  `ticket_history`.`ticket_id` ,  `ticket_history`.`id` ,
`ticket_history`.`name` ,  `ticket_history`.`create_time` 
FROM  `ticket_history` 
INNER JOIN  `ticket` ON  `ticket_history`.`ticket_id` =  `ticket`.`id` 
WHERE  `ticket_history`.`name` LIKE  '%Raw% %new%'
OR  `ticket_history`.`name` LIKE  '%Close'
ORDER BY  `ticket_history`.`ticket_id` ,  `ticket_history`.`id` ASC 

我得到以下输出:

+----+------------+-----+-------------- -----------------+----------+
| 编号 | 票号 | 编号 | 姓名 | 创建时间 |
+----+------------+-----+-------------- -----------------+----------+
| 1 | 1 | 79 | %%关闭 | 2013-06-10 11:50:33 |
| 2 | 2 | 2 | %%2013060810000011%%原始%%3 正常%%新%%2 | 2013-06-08 21:59:02 |
| 3 | 3 | 5 | %%2013060810000021%%原始%%3 正常%%新%%3 | 2013-06-08 21:59:03 |
| 3 | 3 | 22 | %%关闭 | 2013-06-08 22:10:41 |
| 3 | 3 | 82 | %%关闭 | 2013-06-10 11:50:49 |
| 4 | 4 | 88 | %%关闭 | 2013-06-10 11:51:32 |
| 5 | 5 | 64 | %%2013060910000019%%原始%%3 正常%%新%%5 | 2013-06-09 17:12:09 |
| 5 | 5 | 85 | %%关闭 | 2013-06-10 11:51:10 |
| 6 | 6 | 92 | %%2013061010000016%%原始%%3 正常%%新%%6 | 2013-06-10 12:00:24 |
| 7 | 7 | 95 | %%2013061010000025%%原始%%3 正常%%新%%7 | 2013-06-10 13:05:05 |
| 8 | 8 | 98 | %%2013061110000014%%原始%%3 正常%%新%%8 | 2013-06-11 19:05:06 |
| 8 | 8 | 109 | %%关闭 | 2013-06-17 23:57:35 |
| 9 | 9 | 163 | %%2013061810000011%%原始%%3 正常%%新%%9 | 2013-06-18 02:05:06 |
+----+------------+-----+-------------- -----------------+----------+

我需要修改上面的查询,所以我只能列出名称中包含“%RAW% %new%”的每个ticket_id 的行,同时同一个ticket_id 的行中包含“%Close”。

换句话说,应该从上面的输出中显示三行ticket_id 3、两行ticket_id 5 和两行ticket_id 8。

4

5 回答 5

4
SELECT `ticket`.`id` ,  `ticket_history`.`ticket_id` ,  `ticket_history`.`id` ,`ticket_history`.`name` ,  `ticket_history`.`create_time`
FROM tickets t INNER JOIN ticket_history th
ON t.ticket_id = th.ticket_id
WHERE
EXISTS(SELECT 1 FROM ticket_history WHERE name LIKE '%Raw% %new%' AND ticket_id = t.ticket_id)
AND
EXISTS(SELECT 1 FROM ticket_history WHERE name LIKE '%Close' AND ticket_id = t.ticket_id)
于 2013-06-19T11:34:56.567 回答
2

您不能使用 simpleOR来检查结果集中不需要的内容。我的第一个猜测是相关子查询。可能表现不是特别好,但它应该工作。也许是这样的(在我的脑海中,完全未经测试):

SELECT ...
FROM ticket_history AS th INNER JOIN ticket ON ticket_history.ticket_id = ticket.id
WHERE ticket_history.name LIKE '%Raw% %new%' 
AND EXISTS (SELECT * FROM ticket_history WHERE name LIKE '%Close' AND ticket_id = th.ticket_id)
于 2013-06-18T20:17:18.957 回答
2

这些不是重复的行。您要求提供符合条件的工单历史记录及其工单。第一个 ID 是票证 ID。第二个 ID 是工单历史 ID。因为每张工单都有多个工单历史条目,所以您将获得多条记录。我可能会尝试(但尚未测试):

SELECT  `ticket`.`id` 
FROM  `ticket` 
INNER JOIN  `ticket_history` t1 ON  t1.`ticket_id` =  `ticket`.`id` AND t1.`name` LIKE  '%Raw% %new%' 
INNER JOIN `ticket_history` t2 ON t2.ticket_id = ticket.id AND  t2.`name` LIKE  '%Close' 
ORDER BY  ticket.id ASC 

我从选择中删除了 ticket_history 字段,因为没有多条记录就无法获取这些字段,因为您实际上是在要求匹配两个票证历史记录的票证记录。

于 2013-06-18T20:21:18.897 回答
1

最后,这是我根据您的建议和其他一些互联网链接的帮助构建的正确解决方案。谢谢大家的帮助。

SELECT `ticket`.`id`, `th`.`ticket_id`, `th`.`id`, `th`.`name`,  `th`.`create_time`    
FROM `ticket_history` th   JOIN `ticket` ON  `th`.`ticket_id` =  `ticket`.`id`   WHERE (
            `th`.`name` LIKE  '%Raw% %new%'
            AND EXISTS (SELECT * FROM ticket_history th1 WHERE th1.ticket_id = ticket.id AND th1.name LIKE '%Close')
           )
        OR (
            `th`.`name` LIKE  '%Close'
            AND EXISTS (SELECT * FROM ticket_history th2 WHERE th2.ticket_id = ticket.id AND th2.name LIKE '%Raw% %new%')
           )  ORDER BY th.ticket_id, th.id ASC;
于 2013-06-19T14:21:23.470 回答
1

我现在无法对此进行测试,但我认为这可能有效:

SELECT  `ticket`.`id` ,  `ticket_history`.`ticket_id` ,  `ticket_history`.`id` ,
`ticket_history`.`name` ,  `ticket_history`.`create_time` 
FROM  `ticket_history` 
INNER JOIN  `ticket` ON  `ticket_history`.`ticket_id` =  `ticket`.`id` 
WHERE  `ticket`.`id` IN (SELECT `ticket`.`id` FROM `ticket_history`
                       WHERE  `ticket_history`.`name` LIKE  '%Raw% %new%')
ORDER BY  `ticket_history`.`ticket_id` ,  `ticket_history`.`id` ASC 
于 2013-06-18T20:16:45.690 回答