繁体   English   中英

MySQL返回错误的计数结果

[英]mySQL returns wrong Count result

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

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

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

这是对计数的查询,它对“选择*”产生不同的结果

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`

发生这种情况是因为您要按用户ID分组。

如果要运行select *则必须删除group by子句。 那将返回count(*)返回的2个结果。 这些结果恰好具有相同的ID,因此只能归为一个结果。

重大问题更改后进行编辑:

OP在评论中提到:

我想寻找具有多个类别(来自搜索)的任何用户

这意味着您不能盲目地加入类别表。 您必须首先检查用户是否分配了多个类别(与cat_id IN (1, 3, 4)匹配)。 您可以这样进行:

SELECT * FROM user_info ui
JOIN `users` u ON u.id = ui.user_id
LEFT JOIN profile p ON u.id = p.user_id
JOIN (
  SELECT user_id FROM categories
  WHERE cat_id IN (1, 3, 4) 
  GROUP BY user_id
  HAVING COUNT(*) > 1
) c ON c.user_id = u.id
WHERE u.is_enabled = 1 AND ( 
  ui.first_name LIKE '%bob%' OR
  ui.last_name LIKE '%bob%' OR
  p.title LIKE '%bob%' OR
  p.overview LIKE '%bob%'  
)

在这里摆弄。

如前所述,您可以将多个类别与一个用户关联。 因此,在您的情况下无法使用COUNT(*)。 要解决此问题,您可以使用以下任一选项:

简单地说,使用SELECT COUNT(DISTINCT usersid ),就像这个SQL小提琴

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小提琴

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM