2013-03-13 91 views
0

我今天在這裏提出一個讓我感到困惑和困惑的問題。也許外面有人可以給我一點幫助。選擇一組具有特定記錄數據的行

我有三個表如下。請注意,這個問題被簡化了。

// // table_checks

check_id |task_id| status 
    1  | 1 | Done 
    2  | 1 | Done 
    3  | 1 | Done 
    4  | 2 | Done 
    5  | 2 | Not Done 
    6  | 2 | Not Done 
    7  | 2 | Not Done 
    8  | 2 | Done 
    9  | 3 | Done 
    10  | 3 | Done 
    11  | 3 | Not Done 
    12  | 3 | Done 

// // table_user

user_id | email | type 
    1 | [email protected] | IN 
    2 | [email protected] | IN 
    3 | [email protected] | EX 

// // table_chk_usr

check_id |user_id 
    1  | 1  
    2  | 1  
    3  | 1  
    4  | 2  
    5  | 2  
    6  | 2  
    7  | 2  
    8  | 2  
    9  | 3  
    10  | 3  
    11  | 3  
    12  | 3  

這裏有三個表,其在table_chk_usr關係表。

我的問題是如何從表table_user查詢和table_user選擇行與'IN'類型,其中所有的table_checks分配task_ids用戶都與status = done

所以預期的結果應該是如下

// // table_user

user_id | email | type 
    1 | [email protected] | IN 

由於USER_ID 1已經完成了與狀態的所有task_ids完成。

我希望這對您閱讀的人有意義。任何幫助都感激不盡。

請注意,我使用PHP作爲我的服務器端語言,如果這有幫助的話。

回答

2

我想這就是你要找的。

select user.user_id, user.email, user.type, 
sum(if(status = 'done',1, 0)) as done, count(*) as checks 
    from checks 
    join chk_user on checks.check_id = chk_user.check_id 
    join user on chk_user.user_id = user.user_id 
    group by chk_user.user_id 
    having done = checks 

sqlFiddle

+0

..哇,我無語。如果你需要腎臟或肝臟移植給我一個味精。 – BaconJuice 2013-03-13 20:33:31

0

您可以在這裏使用連接,但可能有更好的方法來做到這一點。

SELECT * FROM table_checks 
INNER JOIN table_chk_usr 
    ON table_checks.check_id = table_chk_usr.check_id 
INNER JOIN table_user 
    ON table_chk_usr.user_id = table_user.user_id 
WHERE table_checks.status = 'Done' 
AND table_user.type = 'IN' 
+0

(1)第二JOIN缺少表名稱。 (2)您沒有檢查爲用戶分配的**全部**任務的狀態爲「完成」。 – 2013-03-13 20:00:26

+0

你也忘記了「type ='IN'」,但這是微不足道的 – 2013-03-13 20:03:51

+0

並不是要混淆你。我只是指出,你忘記了OP的要求只返回類型爲'IN'**的用戶**。 – 2013-03-13 20:19:52

相關問題