[英]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
上面是一個查詢及其結果。 當前,這選擇了太多數據,我需要將其縮小到以下范圍:
第一行的方向為outbound
,另一行的方向為inbound
。 如果僅僅是我可以輕松地按方向GROUP BY
。 但是,我需要選擇具有最高c
值的inbound
和outbound
行。 因此,將根據第一行和第三行上方的結果進行選擇。
如何更改查詢以使其返回這些行?
我將使用變量來模擬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相似。
您只需要在group by子句中另外使用MAX函數,例如:
SELECT MAX(c)
FROM mytable
GROUP BY direction
您必須使用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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.