1

因此,我正在尝试修改以下查询:

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表上有一个 INT 列flow,我该如何修改它以仅获取flow.priority等于的结果MAX(priority)

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

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

4

3 回答 3

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()
于 2012-11-10T06:33:58.660 回答
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

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

于 2012-11-10T08:03:41.253 回答
0

你有没有试过这样

WHERE
    (
        flow.parent = 0
        OR flow.parent = :user_flow
    ) AND
    flow.priority = (Select Max(priority) From Flow)
于 2012-11-10T06:31:06.440 回答