2012-11-10 128 views
1

所以,我想修改下面的查询:按MAX()值分组?

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() 

的查询工作它究竟应该如何。不过,我需要修改一下。假设表flow上的INT列为priority,那么如何将其修改为只抓取结果,其中flow.priority等于MAX(priority)

换句话说,我希望查询完成它的功能,但是如果存在优先级值,我希望它只能从最高优先级中进行选择。如果有多个高优先级值,那么它应该选择两个。

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

+0

那么,什么是你找到了解决方案,这将是更容易解释?如果你发布它们而不是派生一个查询然后解释 – nawfal

+2

你对MAX的优先级条件是什么?SELECT MAX(priority)FROM flow'或者'SELECT MAX(priority)FROM flow WHERE(flow.parent = 0 OR flow .parent =:user_flow)AND flow.source = 0 AND ...)'? –

回答

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 

(这是我的猜测,我不知道你的表的确切含义

+0

对不起,格式不正确,我正在使用平板电脑,编辑窗口中没有格式化控件。 – remigio

0

您是否尝试过这种方式

WHERE 
    (
     flow.parent = 0 
     OR flow.parent = :user_flow 
    ) AND 
    flow.priority = (Select Max(priority) From Flow) 
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()