<!–
MySQL – 控制GROUP BY返回的行
在MySQL中,GROUP BY
通常用于从表中选择唯一值并对它们进行汇总。 但是,在某些情况下,您可能想要控制 GROUP BY
返回的行数,可能是一种特定的方式来选择行,或者限制结果集大小以提高性能。
以下是一些控制 GROUP BY
返回行的技巧:
阅读更多:
(adsbygoogle = window.adsbygoogle || []).push({});
1. 使用HAVING来过滤结果
HAVING
语句可以在 GROUP BY
之后应用,在返回结果之前过滤数据。
例如,您可能想要在标签"Books"
上找到 top10 在售书籍。 使用此命令将分组并应用过滤器以返回最高销售前10的书籍。
SELECT
book_id, COUNT(*)
FROM
sales
INNER JOIN books ON sales.book_id = books.id
INNER JOIN tags ON books.tag_id = tags.id
WHERE
tag = 'Books'
GROUP BY
book_id
HAVING
COUNT(*) > 10
ORDER BY
COUNT(*) DESC
LIMIT 10
在这个例子中,HAVING
过滤器通过只返回计数大于10的书籍来限制结果集大小。
2. 使用子查询过滤结果
在某些情况下,使用子查询来过滤 GROUP BY
返回的结果是有用的。 例如,在以下示例中,您可能需要查找与标签为“Books”相同的标签的十大最畅销的书籍。
SELECT
book_id,
sales_count
FROM
(SELECT
book_id, COUNT(*) as sales_count
FROM
sales
INNER JOIN books ON sales.book_id = books.id
INNER JOIN tags ON books.tag_id = tags.id
WHERE
tag = 'Books'
GROUP BY
book_id
ORDER BY
COUNT(*) DESC
LIMIT 10) top_books
INNER JOIN books ON top_books.book_id = books.id
INNER JOIN tags ON books.tag_id = tags.id
WHERE
tag != 'Books'
ORDER BY
sales_count DESC
在这个例子中,我们在GROUP BY
之后使用了一个子查询以获取 top10 的图书ID并执行连接。 在最终结果之后,我们过滤掉了标签为“Books”的行。
总结
MySQL的 GROUP BY
语句为我们提供了一种将表中唯一行分组和汇总的方法。 通过了解如何使用HAVING
过滤器和子查询,我们可以更好地控制返回的结果集,以满足我们的具体需要。
(adsbygoogle = window.adsbygoogle || []).push({});