按MAX()值分组?

时间:2012-11-10 06:23:41

标签: mysql sql

所以,我试图修改以下查询:

SELECT *
FROM flow
INNER JOIN flow_strings
    USING(node_id)
WHERE
    (
        flow.parent = 0
        OR flow.parent = :user_flow
    )
    AND flow.source = 0
    AND :input LIKE CONCAT('%', flow_strings.sql_regex, '%')
ORDER BY flow.parent DESC, RAND()

查询的工作方式完全符合预期。但是,我需要稍微修改一下。假设表priority上有flow INT列,如何修改它以仅获取flow.priority等于MAX(priority)的结果?

换句话说,我希望查询完全按照它的方式执行,但是如果有优先级值,我希望它只从最高优先级中选择。如果有多个高优先级值,则应选择两者。

我在StackOverflow上看到其他一些帖子似乎问了同样的问题,但答案似乎没有解释解决方案 - 他们只发布答案。如果你能附上正在发生的事情的解释,我会非常感激!谢谢!

3 个答案:

答案 0 :(得分:0)

你有没有尝试过这种方式

WHERE
    (
        flow.parent = 0
        OR flow.parent = :user_flow
    ) AND
    flow.priority = (Select Max(priority) From Flow)

答案 1 :(得分:0)

这是最简单,效率最低的答案:

SELECT *
FROM flow
INNER JOIN flow_strings
    USING(node_id)
WHERE
    (
        flow.parent = 0
        OR flow.parent = :user_flow
    )
    AND flow.source = 0
    AND :input LIKE CONCAT('%', flow_strings.sql_regex, '%')
    AND priority=(SELECT MAX priority FROM flow)
ORDER BY flow.parent DESC, RAND()

答案 2 :(得分:0)

解决此问题的一种方法是使用子查询:

SELECT *
FROM flow f
INNER JOIN flow_strings
    USING(node_id)
WHERE
    (
        f.parent = 0
        OR f.parent = :user_flow
    )
    AND f.source = 0
    AND :input LIKE CONCAT('%', flow_strings.sql_regex, '%')
    AND priority=(SELECT MAX(priority) FROM flow f2 where [grouping condition])
ORDER BY flow.parent DESC, RAND()

这样,您只能在满足分组条件的人中选择具有最高优先级的行。通常,这个是主表中的一个或多个字段与子查询中的相应字段之间的相等。例如,在您的情况下可能是:

f.parent=f2.parent

(这是我的猜测,我不确切知道你们桌子的意思。