选择一组具有特定记录数据的行

问题描述:

我今天在这里提出一个让我感到困惑和困惑的问题。也许外面有人可以给我一点帮助。选择一组具有特定记录数据的行

我有三个表如下。请注意,这个问题被简化了。

// // 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作为我的服务器端语言,如果这有帮助的话。

我想这就是你要找的。

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

您可以在这里使用连接,但可能有更好的方法来做到这一点。

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