mySQL 返回错误的计数结果

标签 mysql sql

这是我的数据库和计数查询的 sqlFiddle...

http://sqlfiddle.com/#!2/45150/6

如果我运行 select * 查询,它会返回一行,但是当我对同一个查询运行 count 时,它会给我 2 个结果...

这是对count的查询,它对“select *”产生不同的结果

SELECT count(*)
FROM (`user_info`)

JOIN `users` ON `users`.`id`=`user_info`.`user_id`

LEFT JOIN `profile` ON `users`.`id`=`profile`.`user_id`

JOIN `categories` ON `categories`.`user_id` = `users`.`id`

WHERE `users`.`is_enabled` =  1
AND `categories`.`cat_id` IN (1, 3, 4) 
AND ( 
 user_info.first_name LIKE '%bob%'  
 OR user_info.last_name LIKE '%bob%' 
 OR profile.title LIKE '%bob%' 
 OR profile.overview LIKE '%bob%'  
 )
GROUP BY `users`.`id`

最佳答案

正如您所提到的,您可以将多个类别与一个用户关联。因此,在您的情况下使用 COUNT(*) 是不可能的。要修复它,您可以使用以下任一选项:

很简单,使用 SELECT COUNT(DISTINCT users.id),如 SQL Fiddle :

SELECT count(distinct `users`.`id`)
FROM (`user_info`)
JOIN `users` ON `users`.`id`=`user_info`.`user_id`
LEFT JOIN `profile` ON `users`.`id`=`profile`.`user_id`
JOIN `categories` ON `categories`.`user_id` = `users`.`id`
WHERE `users`.`is_enabled` =  1
AND `categories`.`cat_id` IN (1, 3, 4) 
AND ( 
 user_info.first_name LIKE '%bob%'  
 OR user_info.last_name LIKE '%bob%' 
 OR profile.title LIKE '%bob%' 
 OR profile.overview LIKE '%bob%'  
 )
GROUP BY `users`.`id`

但是,这只会隐藏问题。如果您开始向 select 语句中添加新的聚合函数(如 SUM(salary) 等),问题将再次出现

我想正确的解决方案是修复重复并修改您的 FROM 子句,如下所示:

SELECT count(*)
FROM (`user_info`)
JOIN `users` ON `users`.`id`=`user_info`.`user_id`
LEFT JOIN `profile` ON `users`.`id`=`profile`.`user_id`
WHERE `users`.`is_enabled` =  1
AND ( 
 user_info.first_name LIKE '%bob%'  
 OR user_info.last_name LIKE '%bob%' 
 OR profile.title LIKE '%bob%' 
 OR profile.overview LIKE '%bob%'  
 )
AND `users`.`id` IN (SELECT `user_id` FROM `categories` WHERE `categories`.`cat_id` IN (1, 3, 4) )


GROUP BY `users`.`id`

SQL Fiddle

关于mySQL 返回错误的计数结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20278355/

相关文章:

mysql - 前 10 个值的总和

mysql - 为什么我可以使用 SCHEMABINDING 修改 View 引用的表?

SQL一对一关系定义

php - 如何显示处理ajax发送?

php - mysql DB 不添加具有相似元素的行

mysql - 基于公共(public)标签搜索相关项目的算法

查询之间的mysql时间戳

sql - 当一行具有 MAX 值时,获取它的字符串值 "Yes"?

mysql - 我希望具有 zreo 值的 Studentid 表字段不被插入,我通过使用触发器来执行此操作,但它仍然允许插入它们

javascript - 如何向需要匹配 postrgres 数据库中现有表的 sequelize 模型添加约束?