2016-02-05 58 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