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 

次の出力が得られます。

+----+-----------+-----+-------------------------- ---+---------------------------------+
| | ID | チケットID | ID | 名前 | create_time |
+----+-----------+-----+-------------------------- ---+---------------------------------+
| | 1 | 1 | 79 | %%閉じる | 2013-06-10 11:50:33 |
| | 2 | 2 | 2 | %%2013060810000011%%Raw%%3 通常%%新しい%%2 | 2013-06-08 21:59:02 |
| | 3 | 3 | 5 | %%2013060810000021%%Raw%%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%%Raw%%3 通常%%新しい%%5 | 2013-06-09 17:12:09 |
| | 5 | 5 | 85 | %%閉じる | 2013-06-10 11:51:10 |
| | 6 | 6 | 92 | %%2013061010000016%%Raw%%3 normal%%new%%6 | %%2013061010000016%%生%%3 2013-06-10 12:00:24 |
| | 7 | 7 | 95 | %%2013061010000025%%Raw%%3 normal%%new%%7 | %%2013061010000025%%生%%3 2013-06-10 13:05:05 |
| | 8 | 8 | 98 | %%2013061110000014%%Raw%%3 normal%%new%%8 | %%2013061110000014%%生%%3 2013-06-11 19:05:06 |
| | 8 | 8 | 109 | %%閉じる | 2013-06-17 23:57:35 |
| | 9 | 9 | 163 | %%2013061810000011%%Raw%%3 normal%%new%%9 | %%2013061810000011%%生%%3 2013-06-18 02:05:06 |
+----+-----------+-----+-------------------------- ---+---------------------------------+

上記のクエリを変更する必要があるため、名前に「%RAW% %new%」が含まれる各 ticket_id の行のみを一覧表示でき、同時に同じ ticket_id に「%Close」が含まれる行が含まれます。

つまり、上記の出力から、 ticket_id 3 の 3 つの行、 ticket_id 5 の 2 つの行、および ticket_id 8 の 2 つの行が表示されるはずです。

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

これらは重複行ではありません。条件に一致するチケット履歴レコードとそのチケットを要求しました。最初の ID はチケット ID です。2 番目の 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 

複数のレコードがなければそれらを取得する方法がないため、select から ticket_history フィールドを削除しました。基本的に、2 つのチケット履歴レコードに一致するチケット レコードを要求しているためです。

于 2013-06-18T20:21:18.897 に答える
2

結果セットに不要なものを単純ORにチェックすることはできません。私の最初の推測は、相関サブクエリでしょう。特にうまく機能しないかもしれませんが、うまくいくはずです。たぶん、次のようなものです(頭のてっぺんから外れており、まったくテストされていません):

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 に答える
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 に答える
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 に答える