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都和原来的一样。
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都和原来的一样。