从SELECT查询中删除嵌套部分

时间:2012-01-24 13:12:13

标签: mysql select nested

我一直试图从以下查询中删除嵌套部分:

    SELECT DISTINCT * FROM `audit` WHERE action_performed = 'REJECTED' AND `event_id` IN (
        SELECT DISTINCT event_id AS `Count` 
        FROM `audit` 
        WHERE username = 'someUser' 
        AND action_performed IN ('SUBMITTED_FOR_APPROVAL', 'SAVED_AND_APPROVED')
        AND (action_timestamp >= '2012-01-12 00:00:00' AND action_timestamp <= '2012-01-24 23:59:59'))

基本上,我正在尝试获取用户之前拒绝的事件数量。我通过action_performed列来确定这一点,该列采用的值如下 SUBMITTED_FOR_APPROVALSAVED_AND_APPROVEDREJECTED

我想删除嵌套部分的原因是因为audit表当前包含超过100k行,嵌套查询本身的结果大约是2000行,因此查询总是超时。

我尝试在网站上搜索,并按照一些问题的建议进行内部加入,但也许我做错了! 谢谢。

编辑 - audit表格结构如下

Field              Type   
id                 int(11)
username           varchar(100)
event_id           int(11)
action_performed   varchar(100) 
action_timestamp   timestamp

3 个答案:

答案 0 :(得分:1)

SELECT DISTINCT adata.*
FROM  `audit` AS adata
INNER JOIN `audit` AS aselector ON adata.event_id=aselector.event_id
WHERE
  adata.action_performed = 'REJECTED'
  AND aselector.username = 'someUser' 
  AND aselector.action_performed IN ('SUBMITTED_FOR_APPROVAL', 'SAVED_AND_APPROVED')
  AND aselector.action_timestamp >= '2012-01-12 00:00:00'
  AND aselector.action_timestamp <= '2012-01-24 23:59:59'
;

答案 1 :(得分:1)

在您尝试过的查询中,您将表格与id字段(ON a.id = a2.id)相关联,但在第一个查询中,它们与event_id相关联。这似乎是一个问题,所以请尝试ON a.event_id = a2.event_id

答案 2 :(得分:0)

SELECT DISTINCT AuditTable.event_id, ... -- add other fields here
FROM  `audit` AS AuditTable
INNER JOIN `audit` AS AuditTableB ON AuditTable.event_id=aselector.event_id
WHERE
    AuditTable.action_performed = 'REJECTED'
    AND AuditTableB.username = 'someUser' 
    AND AuditTableB.action_performed IN ('SUBMITTED_FOR_APPROVAL', 'SAVED_AND_APPROVED')
    AND (AuditTableB.action_timestamp BETWEEN '2012-01-12 00:00:00' AND  '2012-01-24 23:59:59')