MySQL COUNT 最高的 GROUP BY 字段(基于 JOIN)

MySQL GROUP BY field with highest COUNT (based on JOIN)

SELECT COUNT(dev_link.id) c, pattern.direction, pattern.section, (
    SELECT to_stop AS `stop`
    FROM dev_link d
    WHERE d.section = section
    ORDER BY d.sequence DESC
    LIMIT 1
) code
FROM pattern
INNER JOIN dev_link ON dev_link.section = pattern.section
WHERE pattern.service = "YSEO252"
GROUP BY pattern.code
ORDER BY c DESC

以上是查询及其结果。目前这是 select 太多的数据,我需要将其缩小到以下范围:

1 行方向为 outbound,另一行方向为 inbound。如果只是我可以轻松GROUP BY方向。但是,我需要 select 一个 inbound 和一个具有最高 c 值的 outbound 行。因此,根据第一行和第三行上方的结果,将 selected.

如何更改我的查询以使其 returns 这些行?

您必须使用 having 子句。

SELECT COUNT(dev_link.id) c, pattern.direction, pattern.section, (
    SELECT to_stop AS `stop`
    FROM dev_link d
    WHERE d.section = section
    ORDER BY d.sequence DESC
    LIMIT 1
) code
FROM pattern
INNER JOIN dev_link ON dev_link.section = pattern.section
WHERE pattern.service = "YSEO252"
GROUP BY pattern.code
HAVING COUNT(dev_link.id) = MAX(COUNT(dev_link.id))
ORDER BY c DESC

您只需要在 group by 子句中额外使用 MAX 函数,例如:

SELECT MAX(c)
FROM mytable
GROUP BY direction

我会用变量来模拟 row_number()

SELECT * FROM (
    SELECT * , 
        @rn := if(@prevDirection = direction, @rn + 1, 1) as rn,
        @prevDirection := direction,
    FROM (
        SELECT COUNT(dev_link.id) c, pattern.direction, pattern.section, (
            SELECT to_stop AS `stop`
            FROM dev_link d
            WHERE d.section = section
            ORDER BY d.sequence DESC
            LIMIT 1
        ) code
        FROM pattern
        INNER JOIN dev_link ON dev_link.section = pattern.section
        WHERE pattern.service = "YSEO252"
        GROUP BY pattern.code
    ) t1 ORDER BY direction, c DESC
) t1 WHERE rn = 1
( SELECT ... WHERE ... AND pattern.direction='inbound' ... LIMIT 1)
UNION ALL
( SELECT ... WHERE ... AND pattern.direction='outbound' ... LIMIT 1 );

否则,每一个SELECT都和原来的一样。