这是我的数据库的sqlFiddle和我的计数查询......
http://sqlfiddle.com/#!2/45150/6
如果我运行select *查询,它会返回一行,但是当我对同一个查询运行计数时,它会给我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`
答案 0 :(得分:3)
这是因为您按用户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%'
)
小提琴here。
答案 1 :(得分:2)
正如您所提到的,您可以拥有与用户关联的多个类别。因此,在您的情况下无法使用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(薪水)等),则会再次出现此问题。
正确的解决方案是,我想是修复重复并修改你的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`