2016-02-05 3 views
3

Я работаю над запросом, и я немного застрял.Выбор строк с наивысшим приоритетом

Вот мой запрос:

SELECT * 
FROM 
    routine_actions AS ra 
JOIN 
    routines AS r ON r.id = ra.routine_id 
JOIN 
    account_routines AS ar ON ar.routine_id = r.id 
JOIN 
    accounts AS a ON a.id = ar.account_id 
WHERE 
    (ra.last_run + INTERVAL ra.interval_minutes MINUTE <= NOW() OR ra.last_run IS NULL) 
AND 
    r.created_at + INTERVAL r.runtime_days DAY > NOW() 

То, что я пытаюсь сделать:

account имеет много процедур. Только один routine может использоваться одновременно, и это routine с наивысшим приоритетом. Таблица, которая содержит столбец приоритета, - account_routines, поскольку учетные записи могут повторно использовать процедуры и задавать другой приоритет.

Более высокое число равно более высокому приоритету. В настоящее время запрос вытаскивает все подпрограммы из всех учетных записей. Но мне нужна только одна процедура с наивысшим приоритетом от каждой учетной записи.

Как это возможно? Мне не нужно решение, просто чтобы посмотреть, чтобы я мог понять, как решить эту проблему.

+1

вы попробовали 'ORDER BY ar.priority desc' ?? –

+0

'ORDER BY' будет по-прежнему включать в себя процедуры с более низким приоритетом? Я работаю с несколькими учетными записями, и мне нужна только 1 процедура для каждой учетной записи. Если я пользователь 'ORDER BY', это даст очень смешанный набор результатов. – BugHunterUK

ответ

1

Я думаю, вам нужно найти максимальный (приоритет) и включить в объединения, чтобы ограничить возвращаемые строки. например

SELECT 
     * 
FROM routine_actions AS ra 
     JOIN routines AS r ON r.id = ra.routine_id 
     JOIN account_routines AS ar ON ar.routine_id = r.id 
     JOIN (
      SELECT 
        account_id 
       , MAX(priority) AS max_priority 
      FROM account_routines 
      GROUP BY 
        account_id 
    ) AS mxr ON ar.priority = mxr.max_priority 
        AND ar.account_id = mxr.account_id 
     JOIN accounts AS a ON a.id = ar.account_id 
WHERE ... 
+0

Пятно на, это сработало. Первоначально я попытался выполнить это: http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html ... но не повезло. Большое спасибо за решение. – BugHunterUK

+0

Я только что понял проблему. Что делать, если учетная запись содержит 2 процедуры. Один с приоритетом 4, другой с 10. Если процедура с приоритетом 10 неактивна, 4 никогда не будут возвращены? Я думал о добавлении предложения WHERE в SELECT в JOIN, но мне понадобится JOIN в JOIN, чтобы вытащить нужную таблицу. Я думаю, что все может стать беспорядочным или иметь проблемы с производительностью таким образом? – BugHunterUK

+0

Это работает. Мысли? http://pastebin.com/XWWbzA5p – BugHunterUK

Смежные вопросы