MySQL计数和加入

时间:2011-02-13 04:04:52

标签: php mysql codeigniter

我正在构建一个有4个表的任务系统:

任务

id | user_id | end_date
-------------------------
2  | 1       | 2011-02-10

用户

id | username
--------------
1  | johndoe
--------------
2  | janedoe

角色

id | role_name
--------------
1  | coordinator

和tasks_roles_users

id | task_id | user_id | role_id
---------------------------------
1  | 2       | 2       | 1

每个任务都有一个创建者(即:johndoe是任务#2的所有者),每个任务都有几个用户在该任务上具有不同的角色,在我的例子中,“janedoe”是任务#2协调员。 我一直试图向“janedoe”和“johndoe”展示他们有多少应有的任务,而且我有这个问题,因为“johndoe”在任务中没有任务,他只是任务所有者。 那么我怎么能告诉他们两个任务到期?

4 个答案:

答案 0 :(得分:2)

您可以通过LEFT JOIN

来完成此操作
SELECT u.id, u.username, 
    IFNULL(t.Cnt,0) OwnCount,
    IFNULL(tr.Cnt,0) RoleCount
    IFNULL(t.Cnt,0) + IFNULL(tr.Cnt,0) TotalCount
FROM users u LEFT JOIN (
    SELECT user_id, COUNT(*) cnt
    FROM tasks
    GROUP BY user_id
  ) t ON u.id = t.user_id
  LEFT JOIN (
    SELECT user_id, COUNT(*) cnt
    FROM tasks_roles_users
    GROUP BY user_id
  ) tr ON u.id = tr.user_id
WHERE t.user_id IS NOT NULL OR tr.user_id IS NOT NULL

答案 1 :(得分:0)

执行此操作的一种简单方法是添加所有者角色并将其视为任何其他角色。另一种方法是使用UNION

答案 2 :(得分:0)

SELECT COUNT(*) FROM tasks_roles_users WHERE user_id IN (SELECT id FROM users WHERE username = 'johndoe')
SELECT COUNT(*) FROM tasks_roles_users WHERE user_id IN (SELECT id FROM users WHERE username = 'janedoe')

答案 3 :(得分:0)

SELECT COUNT(*) FROM tasks_roles_users WHERE user_id = "2"

这将获得“janedoe”卷入的所有任务。

如果没有很多卷(比如少于8),您可能希望将卷保存为代码中的常量,而不是对这么小的事情进行SQL查询。

define('ROLL_COORDINATOR', 1); // just an integer unique from other roll constants