我一直在对一个大表编写查询。我根本不喜欢数据库。查询看起来很大,我觉得可以缩短查询时间,但似乎找不到方法。我尝试使用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 计数和时间是所有(包括杰克和其他人)的总和。
查询没有提供所需的输出,因为它变得越来越复杂。
答案 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