mysql select 不同的行,至少出现 (n) 次

mysql select distinct row, that appears at least (n) times

我是 SQL 的新手,我正在使用 MySQL,并且我有一个包含博客的 table。在那个 table 中,我有一个名为 "blog_category" 的列。我正在尝试 return 来自至少出现 (n) 次的 blog_category 的 DISTINCT 值。示例:

    blog_category
    -------------
    category_1
    category_1
    category_2
    category_3
    category_3
    category_4
    category_4
    category_1
    category_1
    category_2
    category_2

我只想return出现的类别say,至少出现3次(大于等于3次)。

我可以使用 DISTINCT 关键字让它显示出现不止一次的那些,但我只想要实际出现超过指定次数的那些,在这种情况下只是出现在至少 3 次。

所以在这种情况下我只想 return "category_1" 和 "category_2".

我尝试了很多方法,但似乎没有任何效果,我不断收到以下错误:

Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, boolean
given in [FILE NAME OMITTED] on line 101 

以下是我尝试过的一些方法:

$query = "SELECT DISTINCT blog_category 
          FROM blog_posts 
          HAVING COUNT (blog_category) >= 3";

$query = "SELECT DISTINCT blog_category 
          FROM blog_posts 
          WHERE blog_category IN
          (SELECT blog_category
          HAVING (COUNT (blog_category) >= 3))";

$query = "SELECT DISTINCT blog_category 
          FROM blog_posts 
          WHERE blog_category 
          HAVING COUNT(blog_category) >= 3";

$query = "SELECT DISTINCT blog_category 
          FROM blog_posts 
          WHERE COUNT(blog_category) >= 3";

以下是其他用户的建议答案,我已经尝试过但没有成功......

$query = "SELECT blog_category 
          FROM blog_posts 
          GROUP BY blog_category
          HAVING COUNT(*) >= 3";

这里是完整的代码部分 运行(我直接在服务器的 SQL 测试部分进行了测试,它工作得很好,但是当我 运行 实际它保持 return 查询为假的完整代码):

$query = "SELECT blog_category 
        FROM blog_posts
        GROUP BY blog_category
        HAVING COUNT(*) > 2)";

        $result = mysqli_query( $conn, $query );

        if( mysqli_num_rows( $result ) > 0 ) {
            while( $row = mysqli_fetch_assoc($result) ) {
                echo "<ul>";
                echo "<li>" . $row['blog_category'] . "</p>";
                echo "</ul>";           
            }
        }

你需要GROUP BY:

SELECT blog_category 
FROM blog_posts 
GROUP BY blog_category
HAVING COUNT(*) >= 3;

基本上,您不应该将 SELECT DISTINCT 与聚合函数(例如 COUNT(*))一起使用。每当您有 COUNT()MIN()MAX() 等函数时,您应该有一个 GROUP BY 或期望结果集中只有一行。

诚然,也有例外。在某些数据库中,您可能会使用没有聚合等价物的分析函数来执行此操作。这不适用于 MySQL.

您对 having 子句的想法是正确的,但是您缺少 group by 子句来应用每组计数(即,blog_category 的每个不同值):

SELECT   blog_category 
FROM     blog_posts 
GROUP BY blog_category
HAVING   COUNT(*) >= 3

像这样:

SELECT blog_category 
FROM blog_posts
GROUP BY blog_category
HAVING COUNT (blog_category) >= 3

您必须使用 GROUP BY 才能知道如何计数。