Построение MySQL-запроса - PullRequest
       4

Построение MySQL-запроса

2 голосов
/ 25 октября 2011

У меня проблема с запросом. У меня есть таблица агентов, которые делают вещи. Я отслеживаю то, что они делают, в таблице событий. Я хочу, чтобы мои агенты были заняты, но не слишком заняты, поэтому мне нужен запрос, который вернет мне группу агентов, которые сделали не более 10 событий за последние 10 минут и не более 400 событий за последние 24 часа. И из этого пула доступных агентов я могу выбрать одного, чтобы дать что-то сделать

Итак, моя таблица агентов выглядит примерно так:

Agent table
AgentID.       AgentName
1                    Bob
2                    Sue

Event Table

Event ID.     Agent ID.    Event Timestamp
1                  2        1319525462
2                  1        1319525462
3                  2        1319525462

Очевидно, что эти таблицы просто для того, чтобы дать форму БД. В общем, что мне нужно и не удалось выяснить, это как выбрать группу операторов из объединения, которое возвращает группу агентов, которые выполнили не более 10 событий за последние 10 минут и не более 400 событий в последние 24 часа Мои реальные таблицы более сложны, но я просто ищу общий принцип о том, как структурировать запрос, который бы дал желаемый результат. Заранее спасибо за помощь!

** UPDATE основываясь на ответе Бенуа, я придумал это:

SELECT DISTINCT username FROM campaign_agents 
LEFT OUTER JOIN (SELECT count(event_index) myevents, field_event_agent_value FROM new_event WHERE field_event_time_value BETWEEN 1320206138 AND 1320292538 GROUP BY field_event_agent_value ) last_24_hours 
ON last_24_hours.field_event_agent_value = campaign_agents.username 
LEFT OUTER JOIN (SELECT count(event_index) myevents, field_event_agent_value FROM new_event WHERE field_event_time_value BETWEEN 1320291938 AND 1320292538 GROUP BY field_event_agent_value ) last_10_mins 
ON last_10_mins.field_event_agent_value = campaign_agents.username 
WHERE last_24_hours.myevents < 550 AND last_10_mins.myevents < 10

Но он не получает агентов в таблице campaign_agents, которые еще ничего не сделали и, следовательно, не находятся в таблице событий. Разве LEFT OUTER JOIN не должен включать все в первую таблицу, campaign_agents, даже если нет совпадений со второй таблицей? Нужно ли ставить оператор ИЛИ после того, как их включить?

1 Ответ

0 голосов
/ 25 октября 2011

Вы можете попробовать:

SELECT agent.agentid
  FROM agent
 INNER JOIN (SELECT count(eventid) events, agentid
               FROM event
              WHERE timestamp BETWEEN /* (now - 24 hours) */ AND /* now */ -- adapt this
              GROUP BY agentid
            ) last_24_hours
    ON last_24_hours.agentid = agent.agentid
 INNER JOIN (SELECT count(eventid) events, agentid
               FROM event
              WHERE timestamp BETWEEN /* (now - 10 minutes) */ AND /* now */ -- adapt this
              GROUP BY agentid
            ) last_10_mins
    ON last_10_mins.agentid = agent.agentid
WHERE last_24_hours.events < 400
  AND last_10_mins.events < 10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...