2016-02-05 60 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個將永遠不會返回?我正在考慮在JOIN中向SELECT中添加WHERE子句,但是我需要在JOIN中加入一個JOIN以將所需的表拉入。我認爲事情可能會變得混亂,或者出現性能問題? – BugHunterUK

+0

這工作。思考? http://pastebin.com/XWWbzA5p – BugHunterUK