Удаление вложенной части из запроса SELECT - PullRequest
2 голосов
/ 24 января 2012

Я застрял, пытаясь удалить вложенную часть из следующего запроса:

    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_APPROVAL, SAVED_AND_APPROVED и REJECTED.

. Причина, по которой я хочу удалить вложенную часть, заключается в том, что таблица audit в настоящее время содержитболее 100 тыс. строк, а результат самого вложенного запроса - около 2000 строк, поэтому время ожидания запроса всегда истекло.

Я попытался выполнить поиск на сайте и выполнил ВНУТРЕННЕЕ СОЕДИНЕНИЕ, как предлагается в некоторых вопросах,но возможно я делал это неправильно!Спасибо.

РЕДАКТИРОВАТЬ - Структура таблицы audit выглядит следующим образом

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

Ответы [ 3 ]

1 голос
/ 24 января 2012

В запросе, который вы пробовали, вы связали таблицы с полем id (ON a.id = a2.id), но в первом запросе они связаны с event_id.Это кажется проблемой, поэтому попробуйте ON a.event_id = a2.event_id.

1 голос
/ 24 января 2012
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'
;
0 голосов
/ 24 января 2012
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')
...