【发布时间】: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 错误。结尾有一个虚假的(不匹配的)结束括号,字符......文字后面的括号......
> 2)";完全不清楚为什么要添加关闭括号。 (这不在 Gordon Linoff 的回答中提供的查询中。)