使用多个类似的内部查询优化选择查询

时间:2019-06-09 04:27:03

标签: sql database mariadb

我一直在对一个大表编写查询。我根本不喜欢数据库。查询看起来很大,我觉得可以缩短查询时间,但似乎找不到方法。我尝试使用WITH子句,这会使查询更简单。但是,我不能使用它。

以下是查询:

 SELECT id, 
       name, 
       Count(name), 
       SUM(event.time_spent_millis), 
       flag, 
       template 
FROM   event 
WHERE  event.host = 'mantis' 
       AND event .` input ` NOT LIKE '%random%' 
       AND id IN (SELECT event1.id 
                  FROM   event AS event1 
                  WHERE  ( event1.host = 'mantis' 
                           AND timestamp BETWEEN 1559337058633 AND 1559683282607 
                           AND template IN ( 'wrap' ) 
                           AND event1.flag = '22' 
                           AND event1.name = 'jack' )) 
        OR id IN (SELECT a.id 
                  FROM   event AS a 
                  WHERE  a .` input ` LIKE '%random%' 
                         AND a.name = 'jack' 
                         AND a.host = 'mantis' 
                         AND template IN ( 'wrap' ) 
                         AND timestamp BETWEEN 1559337058633 AND 1559683282607 
                         AND a.flag IN ( '0', '1' ) 
                         AND a.id NOT IN (SELECT b.id 
                                          FROM   event AS b 
                                          WHERE  b.flag = '22' 
                                                 AND b.host = 'mantis' 
                                                 AND b.timestamp BETWEEN 
                                                     1559337058633 AND 
                                                     1559683282607 
                                                 AND b.name = 'jack')) 
GROUP  BY id, 
          name 

样本数据:

id  name    time    flag    template
aaa123  jack    6561    22  wrap
aaa123  matt    18  NULL    NULL
aaa123  matt1   1126    0   NULL
baa123  jack    6561    22  wrap
baa123  matt    18  NULL    NULL
baa123  matt1   1126    0   NULL

总结一下我想要的结果是:

对于给定的输入,我希望所有与标志相关的名称以及与该名称相关的名称。

在给定数据中,输出将识别标志 22 jack 具有 2 个计数和 others 具有 4 计数和时间是所有(包括杰克和其他人)的总和。

查询没有提供所需的输出,因为它变得越来越复杂。

1 个答案:

答案 0 :(得分:0)

我认为,以下代码是使用子查询的SQL的优化版本

SELECT id, 
       name, 
       Count(name), 
       SUM(event.time_spent_millis), 
       flag, 
       template 
FROM   event e
WHERE  e.host = 'mantis' 
       e.timestamp BETWEEN 1559337058633 AND 1559683282607 
       AND e.template = 'wrap' 
       AND e.flag = '22' 
       AND e.name = 'jack'
       AND (
         (e .` input ` NOT LIKE '%random%' AND e.flag = '22')
         OR
         (e .` input ` LIKE '%random%' AND e.flag IN ( '0', '1' ))
       )
GROUP  BY e.id, 
          e.name