2013-11-29 283 views
1

這裏是sqlFiddle對我的數據庫,我的數查詢......的MySQL返回錯誤計數結果

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

如果我運行一個SELECT *查詢,它返回我一個行,但是當我運行指望相同的查詢,它給了我2個結果...

這是計數查詢時,它產生於「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

選擇*回報我2行:http://sqlfiddle.com/#!2/45150/22 – cha

+1

@cha因爲你沒有通過users.id把'組' – Hussain

回答

1

正如你所提到的,你可以有多個與用戶關聯的類別。因此,在您的情況下不能使用COUNT(*)。要解決它,你可以使用下列選項:

很簡單,在這個SQL Fiddle使用SELECT COUNT(DISTINCT usersid。),如:

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

2

那是因爲你是GR不同的結果ouping由用戶標識。

如果要運行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

+0

但我只想看到一個用戶?每個用戶在類別表中選擇了多個類別...我不想重複他們?例如, 例如,搜索可以用於類別ID 1,2,3,並且用戶1具有表1中的1,2,3,它將向我顯示用戶1的3次,我想只顯示他一次。 –

+0

我已經解釋了爲什麼'錯誤的計數結果'沒有錯。如果你需要一個特定的輸出,那麼你應該添加到這個問題。無論如何,如果你想只顯示在一行中的用戶...那麼什麼類別的id將包含該行?我可以在查詢中看到,您添加了用戶的cat_id 4和1 ...您選擇哪一個顯示在該行中,爲什麼? –

+0

請注意,..但你看,在查詢中,我有 JOIN'categories' ON'categories'.'user_id' ='users'.''' AND'categories'.'cat_id' IN(1,3 ,4)........和cat_id來自數組...因爲有多個類別分配給每個用戶,所以正在公佈行。我得到正確的結果問題與計數,我能做些什麼來使它正確? –