MySQL – 控制GROUP BY返回的行


<!–

–>

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({});