【问题标题】:mysql select distinct row, that appears at least (n) times [duplicate]mysql选择不同的行,至少出现(n)次[重复]
【发布时间】:2017-10-17 20:09:01
【问题描述】:

我对 SQL 很陌生,我正在使用 MySQL,并且我有一个包含博客的表。在该表中,我有一个名为“blog_category”的列。我正在尝试从至少出现 (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

我只想返回至少出现 3 次(大于或等于 3)的类别。

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

所以在这种情况下,我只想返回“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 测试部分进行了测试,它工作得很好,但是当我运行实际的完整代码时,它一直返回查询为假):

$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>";           
            }
        }

【问题讨论】:

  • 在 where 之后删除不同的添加 group by blog_Category;在拥有之前。如果没有在哪里。
  • 这不是关于“运气”,而是关于拥有规范样本数据预期输出。 Gordon 提供的查询模式是规范的方法。如果查询返回意外结果,则可以进行调查。如果查询抛出错误,也可以进行调查。但是将观察到的行为解释为“似乎没有任何效果”和“没有运气”是对实际问题的不充分描述。 ericlippert.com/2014/03/05/how-to-debug-small-programs
  • 检查返回查询执行mysqli_query,如果是FALSE,使用mysqli_error函数检索MySQL错误。例如if(!$result) { printf(mysqli_error($conn)); }
  • 报告的是 SQL 查询文本的第 4 行,而不是 PHP 程序。 MySQL 说发送给它的 SQL 中有一个 syntax 错误。结尾有一个虚假的(不匹配的)结束括号,字符......文字后面的括号...... &gt; 2)";完全不清楚为什么要添加关闭括号。 (这不在 Gordon Linoff 的回答中提供的查询中。)

标签: php mysql sql innodb


【解决方案1】:

你需要GROUP BY:

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

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

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

【讨论】:

  • 上述查询的输出/错误是什么?
  • 它一直告诉我查询返回 false 并出现错误:警告:mysqli_num_rows() 期望参数 1 为 mysqli_result,布尔值在第 101 行的 [FILE NAME OMITTED] 中给出
  • 好的,所以我在实际服务器上再次运行它,它工作得很好并且符合预期(您的查询答案)。但由于代码中的某种原因,它不起作用。但是,如果我删除 Group By 和 Have Count,代码返回就好了。所以基本上只有 SELECT 和 FROM 语句在代码中工作得很好。我不明白出了什么问题。
【解决方案2】:

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

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

【讨论】:

  • @DustinHammack 你能详细说明这里到底是什么不起作用吗?
  • 我尝试了您共享的确切代码,但每次都收到相同的错误,告诉我查询返回 false.... 以下错误是我继续收到的错误:警告: mysqli_num_rows() 期望参数 1 为 mysqli_result,布尔值在第 101 行的 [FILE NAME OMITTED] 中给出
【解决方案3】:

像这样:

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

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

【讨论】:

  • 在回答之前,我在 MS Access 中复制了您的数据库并对其运行查询,它成功地向我显示了 cat1 和 cat2。您的数据库架构中是否还有其他可能相关的功能?它返回了什么?
  • 每次都出现同样的错误,告诉我查询返回 false... 警告:mysqli_num_rows() 期望参数 1 为 mysqli_result,布尔值在第 101 行的 [FILE NAME OMITTED] 中给出跨度>
  • 我建议您将代码与答案提供的查询一起发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-04
相关资源
最近更新 更多